扫描器
SLICC工具共享的浏览器知识. SLICC在Chrome DevTools协议(CDP)上驱动一个真正的Chromium浏览器,几个程序用不同语言写成,需要就同样的事实达成一致:
- 哪些浏览器存在,安装在何处,以及如何为SLICC推出;
- 如何找到一个已经使用调试端口运行的浏览器,以及选择哪个;
- 源代码浏览器控制 永远 触摸,从7个自己的来源和金库开始;
- 如何证明一个CDP的警卫真的让客户远离他们.
这些程序不能共享代码,因此它们共享数据:1个目录,4个测试向量和他们的JSON schemas,作为Go模块,一出Rust箱子和npm包在同一版本发布.
| 谁 | 用它来 |
|---|---|
| 斯莱克-克利 (开始) | slicc browsers, (中文(简体) ), slicc launch及其CDP继电器的后卫 |
切片- cdp (又请按: wasm32-wasip1(中文(简体) ) | playwright-cli list 财务报告和审定财务报表 open和它的守护 |
| 塑料剂 | 拒绝其浏览器工具中受保护的出处 |
| 生化剂, (中文(简体) ), 扩展 | 他们的CDP卫士,对卫兵矢量进行测试 |
里面的东西
| 文件 | 这是什么 |
|---|---|
catalog.json | 每个已知的Chromium浏览器和 Electron app,每个OS安装路径,发现和排名规则,七个发射旗和预告,配置位置和被保护的起源 |
corpus/, (中文(简体) ), corpus.json | 发现相符合的情况:每个都有一台假机器,并附有它必须制作的排序浏览器列表 |
protected.json, (中文(简体) ), protected.mjs | 保护源测试向量,以及 JavaScript 中的参考匹配器 |
guard-vectors.json | 每个守卫都必须通过 |
debugger-stage1.json | 共享第一阶段调试器符合性数据 |
guard-runner.mjs, (中文(简体) ), guard-driver.mjs, (中文(简体) ), fixture-server.mjs | 守护向量、其助手和测试服务器的参考跑取器 |
schema/ | JSON Schema(2020-12年),用于上面的每个文件,以及 --json 产出 slicc browsers 财务报告和审定财务报表 playwright-cli list |
安装
走开
go get github.com/ai-ecoverse/slicc-browsers
import sliccbrowsers "github.com/ai-ecoverse/slicc-browsers"
c := sliccbrowsers.Default()
chrome, ok := c.Browser("chrome")
rank := c.Priority("chrome")
文件是嵌入的,因此运行时没有从磁盘读取.
Default()分析一次嵌入式目录,如果它不能,就会惊慌失措,CI排除了这一点;Load()返回错误,然后Parse(b)读取另一个副本.Corpus(), (中文(简体) ),Protected(), (中文(简体) ),Guard()财务报告和审定财务报表DebuggerStage1()返回向量为已键入的结构.CatalogJSON(), (中文(简体) ),CorpusJSON(), (中文(简体) ),ProtectedJSON(), (中文(简体) ),GuardVectorsJSON(), (中文(简体) ),DebuggerStage1JSON()编辑…SchemaJSON()函数返回原始文件.
锈
[dependencies]
slicc-browsers = { version = "1", features = ["serde"] }
[dev-dependencies]
slicc-browsers = { version = "1", features = ["corpus"] }
| 特性 | 添加 |
|---|---|
| 无 | CATALOG 和计谋 &str 常数,没有依赖性 |
serde | 类型 Catalog, (中文(简体) ), catalog(), (中文(简体) ), Catalog::browser 财务报告和审定财务报表 Catalog::priority |
corpus | 向量( e)CORPUS, (中文(简体) ), PROTECTED, (中文(简体) ), GUARD_VECTORS, (中文(简体) ), DEBUGGER_STAGE1)和模块 corpus, (中文(简体) ), protected, (中文(简体) ), guard 财务报告和审定财务报表 debugger_stage1,用于测试 |
每个功能都用于 wasm32-wasip1保留 corpus 内 [dev-dependencies] 所以它不会释放 建造.
无
npm install @ai-ecoverse/slicc-browsers
import catalog from '@ai-ecoverse/slicc-browsers' with { type: 'json' };
import { protectedOrigins } from '@ai-ecoverse/slicc-browsers/protected.mjs';
| 导出 | 这是什么 |
|---|---|
., (中文(简体) ), ./catalog.json, (中文(简体) ), ./corpus.json, (中文(简体) ), ./protected.json, (中文(简体) ), ./guard-vectors.json, (中文(简体) ), ./debugger-stage1.json | 数据 |
./schema/<name>.schema.json | 计划 |
./protected.mjs | 保护原生匹配者 |
./seven.mjs | isSevenLabel(seven, label): 是否为 sliccy.ai 主机标签可以是七个实例 |
./guard-runner, (中文(简体) ), ./guard-driver.mjs | 守护向量跑者及其助手 |
./fixture, (中文(简体) ), ./fixture-client | 测试服务器(仅节点)和远程服务器的客户端 |
除了别的事 ./fixture 在浏览器和节点中运行. protected.mjs 财务报告和审定财务报表 seven.mjs 输入什么,所以扩展名或服务员可以自行运送文件.
目录
catalog.json 保存程序需要了解的所有浏览器:
- 浏览器. Chrome, Edge, Brave, Opera, Vivaldi, Arc, Atlas, Dia 及其释放前通道, Chrome for Testing and Chromium, 按优先顺序排列。每个都有它的macOS捆绑,Windows安装了根和注册密钥,Linux 二进制,
.desktopids,平板电脑和 snap names, 及其默认的用户数据 dir. - 电子软件:被捆绑的id所已知的应用程序,以及阻断远程调试的应用程序.
- 排名:有7个制表符的端点先来后去其他运行的端点,再安装Chrome,其他已安装的Chrome浏览器,Electron Apps,以及SLICC 6的配置图后去. 不包括比Chrimium 116更年长的浏览器.
- 发现数字 :
DevToolsActivePort文件、要探测的端口、进程扫描、以及端点如何命名、正常化和合并. - 七号: 哪个
sliccy.ai主机为7个实例,开关、被禁用特性和配置预示了7个需求的发射. - 简介和平台: SLICC 保存其浏览器配置,每个OS的配置 Dirs和注册密钥.
- 受保护的起源: 见 下级。 。 。 .
目录是 "schema": 1。小释放只添加字段;修改或去除一个字段需要方案2和主要释放。 slicc-cli 不保留自己的浏览器表格:添加或更改浏览器,更改 catalog.json,释放,并打破依赖.
发现
一个程序列出它可以从四个来源附带的浏览器: DevToolsActivePort 已知用户数据 dirs 和 SLICC 配置文件中的文件, --cdp URL,一个端口9222至9229的探针,以及过程列表. 它对端点进行排序,添加它可以发射的已安装浏览器,并打印列表形状为: schema/browsers.schema.json。 。 。 . sLEC-CLI的读取器 描述该输出。 七"的分页只按出处报告,从没有路径,查询或标题.
进程源
进程扫描找到其它开始的浏览器 --remote-debugging-port它写着: ps 关于 Unix 和 Get-CimInstance Win32_Process 在 Windows 上,跳过诸如 node, (中文(简体) ), npx 或外壳,并取出端口和 --user-data-dir 从命令行,即使路径有空格。 有了0号端口,它就能读出端口 DevToolsActivePort。准确的解析规则在 catalog.json是因为 discovery.process {\fn黑体\fs20\shad2\2ah82\3ah20\4ah33\fscx95\3ch592001\be1}和尸体保护官们 {\fn黑体\fs20\shad2\2ah82\3ah20\4ah33\fscx95\3ch592001\be1} process-* 案例。 测试总是伪造过程列表.
SLICC 6 简介
SLICC 6,上一代,发射Chrome在它自己的外形上(browser-coding-agent-chrome 6's profile root,或 SLICC_USER_DATA_DIR) (中文(简体) ). 发现者列出这样的终点,标记它 six: true 并排为后,但 从不自己挑只有明确的请求,例如: slicc --profile six,使用它。 每个操作系统都有根 catalog.json是因为 profiles.six。 。 。 .
炸弹
每个案件 corpus/<case>/ 是假机器 家目录, DevToolsActivePort 文件, 伪造 /json/version 财务报告和审定财务报表 /json/list 答案,一个假进程列表, --cdp URL和已安装的浏览器. expected.json 持有它必须制作的排名列表. case.json是因为 needs 说一个程序必须支持什么来管理案件(process, (中文(简体) ), probe, (中文(简体) ), six, (中文(简体) ), tabs),一个程序跳过无法运行的案例.
对于每个案例,一个测试装置:
- 将案件档案写入临时住所;
- 指该家庭的发现和案件的环境;
- 输入假进程列表,并引导每个 HTTP 请求和 TCP 拨打假程序;
- 比较结果与
expected.json。 。 。 .
两所图书馆都为此提供了帮助:
cases, _ := sliccbrowsers.Corpus()
for _, c := range cases {
if !c.Runs(runtime.GOOS, sliccbrowsers.NeedFlag, sliccbrowsers.NeedProcess) {
continue
}
l := sliccbrowsers.Layout{OS: runtime.GOOS, Home: t.TempDir(), Getenv: func(k string) string { return c.Input.Env[k] }}
// write c.Files(l); fake c.PSOutput(l, os.Getpid()); use c.Transport() and c.DialContext;
// compare with c.ExpectedJSON(l)
}
use slicc_browsers::corpus::{corpus, Layout, NEED_PROCESS, NEED_PROFILES};
let cat = slicc_browsers::catalog();
for case in corpus().cases {
if !case.runs(os, &[NEED_PROFILES, NEED_PROCESS]) {
continue;
}
let env = |k: &str| case.input.env.get(k).cloned();
let layout = Layout { os, home, env: &env, catalog: &cat };
// write case.files(&layout); fake case.ps_output(…); answer with case.http_get(…);
// compare with case.expected(&layout)
}
斯莱克 -克利的 test/integration/corpus_test.go 是一个完整的绳子。 机体从不使用9222到9229等端口,其中开发商自己的克罗姆可能正在监听.
受保护的起源
浏览器控制决不能导航、打开、附加或读取以下的饼干或存储:
- 七和金库: 每一个
sliccy.ai在任何端口和计划上的主机,以及vault.sliccy.ai名称; - 浏览器自己的特权页面数字 :
chrome://而其他Chromium浏览器的等同,devtools://, (中文(简体) ),chrome-extension://(密码管理器和钱包所在的地方),file://还有克罗姆自己的UI目标 新的标签页是一个例外; - 一个程序的额外七个来源比如slicc -cli的书
--origin。 。 。 .
URL被判断为浏览器如何剖析它们,所以 blob:, (中文(简体) ), view-source: 财务报告和审定财务报表 about: 化名,回鞭,编码的点和全宽字母不能偷偷地通过. 在浏览器装入时, 守护者无法将 URL 计数为受保护 。 打开的标签保存了 7 的出处 about:blank。拒绝的呼叫失败 slicc: refused: target is on seven's origin。 。 。 .
普通页面内的浏览器扩展框架,如密码管理器的自动填充列表,并不能使标签受到保护. 相框本身无法达到:无法被附加或读取,其URL从未出现在目标发现,页面读取,快照,可访问树或评价结果中. 标签的自有页面仍然可以被读取并被快照. 屏幕截图和输入只允许在隐藏每个扩展框时进行(没有布局框或 visibility: hidden),而没有人通过嵌入的文件或阴影根来保持焦点;一个被显示的截图被丢弃. 不透明与位置不计为隐藏. 接受在能见度或焦点检查和CDP回复之间的比赛. 在标签中显示任何扩展框时,拒绝全页抓取并开始屏幕播放。 如果一个屏幕显示器在扩展框出现时已经运行, 守护者会停止它, 或每隔一段时间就会下降 Page.screencastFrame 直至框架消失 Page.startScreencast 在干净的标签上也可以。 这些拒绝指定了扩展框架,而不是7个. 从程序自己的扩展框,以及任何其他被保护的帧,仍然使整个分页被保护. protectedOrigins.extensionFrames 列出计划、方法和拒绝,以及 protected.mjs 提议 extensionFrame(url)。 。 。 .
catalog.json是因为 protectedOrigins 持有规则,和 protected.json 矢量:URL、目标、饼干域和存储键,每个键都有预期的答案. protected.mjs 是参考执行:
import catalog from '@ai-ecoverse/slicc-browsers' with { type: 'json' };
import { protectedOrigins } from '@ai-ecoverse/slicc-browsers/protected.mjs';
const guard = protectedOrigins(catalog.protectedOrigins, ['http://127.0.0.1:5710']);
guard.url('https://seven.sliccy.ai/');
guard.cookieDomain('.sliccy.ai');
guard.target({ url: 'about:blank', opener: 'protected' });
还提供 storageKey(key) 财务报告和审定财务报表 unparseable(text)GO 或 Rust 执行需要一个WhatWG URL解析器,而不是 net/url,而且必须通过每个矢量 protected.json。 。 。 .
守护向量
守护者在代理浏览器工具等CDP客户端和浏览器之间坐相,使客户端远离被保护的出处. guard-vectors.json 对这个承诺进行一百多起攻击,每个警卫必须全部通过。 它们包括导航、重定向链、弹出和帧、请求截取、饼干和存储访问、特权页面、错误页面、外国扩展世界、调试器和仪表技巧,以及会话覆盖会漏入受保护页面.
每个向量运行两次. 这个 控制 运行它与普通的起源, 它必须在那里工作。 这个 守卫 这条腿贯穿着保护目标,必须拒绝或没有任何效果。 A 类 活 动 证明被保护的目标真的在那里 一行只有在三个都通过的时候才能通过,所以一个后卫不能通过打破一切,一个测试也不能通过永远不能到达目标.
当一个向量比较普通和被保护的固定标记时,这些标记并不相互包含. 被保护标记检查仍然检查完整的探测回复,包括出错,以及矢量的客户端事件和消息,包括被编码的值.
警卫可以拒绝每个客户端的导航 about: 继承来源的 URL, 例如 about:blank。拒绝离开受保护页面的普通导航仍然失败.
客户端-出厂控制使用无人看守的观察者;持续的能力拒绝是有效证据,获得的仪器出厂后必须不留任何效果,缺失的答案仍然不完整.
移交审计保留早期快照作为证据。 完整的最后分类账取代了不完整的早期快照,但任何审计中报告的任何转发都仍然是一个失败。 不完整的最后审计仍缺乏证据.
运行他们
参赛者与任何能讲CDP的警卫合作:
import set from '@ai-ecoverse/slicc-browsers/guard-vectors.json' with { type: 'json' };
import { run } from '@ai-ecoverse/slicc-browsers/guard-runner';
import { fixtureServer } from '@ai-ecoverse/slicc-browsers/fixture';
const fixture = await fixtureServer();
const execution = await run(set, {
clientFactory: (row) => connectGuardAndObserver(row),
targets: originsFor(fixture),
capabilities: { autoAttach: true, browserSession: true, browserContexts: true, discovery: true },
parallel: 4,
fixture,
});
console.log(execution.summary({ guard: 'my-guard', sha: process.env.GITHUB_SHA }).line);
await fixture.close();
您提供 :
- 被监视的客户 每行:你的警卫的CPD连接,与
send(method, params, sessionId), (中文(简体) ),waitEvent(predicate, ms)还有一个events阵列; - 无人看守的观察员:直接连接同一浏览器的CDP,运行控制并检查活性;
- 来源:固定服务器可达7个,金库和一个普通站点. 用 Chrome 标出受保护的主机名
--host-resolver-rules因此,没有任何试验 接触真正的7; - 能力:你的运输能力。 需要你未声明的一行被跳过
not-supported:<capability>。 。 。 .
| 能力 | 表示运输可以 |
|---|---|
autoAttach | 自动附着到弹出和iframe等儿童目标 |
browserSession | 将命令发送到浏览器会话, 不仅发送到页面 |
browserContexts | 创建孤立的浏览器背景 |
discovery | 报告没有会话的目标创建和更改 |
chromeUrlsAttach | 附 录 chrome:// 页面(DevTools端口的CDP; chrome.debugger 无法) |
extensionWorld | 在测试页面上主机为外国扩展的内容脚本 |
extensionFrame | 运行带宽, 其框架为普通测试页 |
clientExit | 在一行中间关闭守护客户端 |
siteIsolationOff, (中文(简体) ), inboundDelay, (中文(简体) ), forwardAudit | 在不与网站隔离的情况下运行, 将浏览器的信息保存到守护者手中, 并审计守护者发送的信息 |
forwardAudit 允许观察员在客户端历史超时后仅使用终端恢复 historyTrigger: { id: "history-trigger", complete: true, forwarded: false } 证明来自 audit({ historyTrigger: command, probes: [], final: false }),保持探测器分类账的开通;缺失的证明,转发或迟到的答覆均不视为拒绝.
读取结果
每行报告 control, (中文(简体) ), guarded 财务报告和审定财务报表 live 作为 pass, (中文(简体) ), fail, (中文(简体) ), skip, (中文(简体) ), incomplete (测试无法收集自己的证据)或 not-run (仅以文字描述的医生). summary() 将行变为一行:
GUARD-PASS my-guard@1a2b3c4 (vectors @ai-ecoverse/[email protected])
跑道只有在每行都经过而且没有漏掉时才会通过。 跑者永远不会给出一个原因的跳跃,比如编造能力,被报告为伪造,跳出和不完整行被计算在行上,因此行不能过度描述测试过的内容.
要知道什么是矢量检查, 读在 guard-vectors.json: 每一个都列出其步骤,每个观察的 means页:1 live 情况及其预期结果. schema/guard-vectors.schema.json 定义格式.
发展
你需要去1.26, 罗斯稳定与 wasm32-wasip1 目标,节点 24 或以后,以及用于浏览器测试的 Chrome 或 Chromium : 它们使用 CHROME_PATH,或用于测试的色调 npx slicc-cdp install-browser 安装,并运行它无头,除非 CI 设定( e)SLICC_HEADLESS=1 或者说 0 (原始内容存档于2017-03-25). overse.
| 命令 | 它会做什么 |
|---|---|
npm run corpus | 重建 corpus.json 从 corpus/ |
npm run validate | 检查每个文件 与它的计划 和规则 一个计划不能表达,运行 protected.json 结束 protected.mjs |
npm run lint | Biome, 斑块花纹规则, gofmt, (中文(简体) ), go vet linux, macOS 和 Windows, golangci-lint, 用于 Linux, macOS 和 Windows, 用于 Golangci-lint , 用于 Linux , 用于 Golangci-lint , cargo fmt缩写和一个 wasm32-wasip1 检查每个特性 |
npm test | 每个文件在 test/integration/:验证,节点,去和鲁斯特测试,以及参照跑者对真正的Chrimium,没有警卫,每个控制都必须通过,每个保护必须失败 |
npm run build | gO模块,箱子(也用于 wasm32-wasip1),和 npm 软件包 |
新的发现行为得到一个尸体箱, 新的警卫行为得到一个警卫矢量.
CI和释放
CI为 塑料-共享网络管道,从 .github/workflows/ci.yml。拉动请求被擦出,然后 npm test 然后是克劳德和Codex评论;合并队列运行了林特和再次测试。 测试只在Linux上进行.
每次合并到 main 这说明它通过语义发布 在同一工作流程中,作为一个版本,所有三个软件包。 这个 vX.Y.Z 标签是 Go 发布, npm 通过可信赖的出版获得来源的软件包 。 礛 ci.yml 发布板条箱到板条箱.io, 并发布可信, 并询问 Go 模块代理和 pkg.go.dev 的新标签 。 被推动的标签从不被移动或删除:一个糟糕的发布被下一张固定.