emiliano-go/trustsight
GitHub: emiliano-go/trustsight
一款用于在执行 yay -Syu 前审查 AUR 软件包 PKGBUILD 更新的安全风险评分工具,通过分层证据帮助用户识别潜在的恶意行为和结构性风险。
Stars: 3 | Forks: 0
# TrustSight
在你更新之前审查 AUR PKGBUILD:捕获粗心的恶意行为和结构性风险,并告知你它无法验证的内容。
## 30 秒示例
```
trustsight review
```
```
TrustSight Review
┏━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ Package ┃ Risk Score ┃ Verdict ┃
┃ ┃ ┃ ┃
┡━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩
│ chez-scheme-bin │ 0/100 │ Version bump. No structural changes. │
├─────────────────┼──────────────┼───────────────────────────────────────────┤
│ sketchy-pkg │ 35/100 │ R004 HIGH Checksum disabled (SKIP). │
│ │ │ C003 INFO Source URL changed without │
│ │ │ version bump. │
│ │ │ SOURCE_BUCKET MEDIUM New domain: │
│ │ │ sketchy-cdn.invalid (unknown). │
│ │ │ NOVELTY HIGH Source URL first seen │
│ │ │ globally. │
│ │ │ PINNING INFO Source pinning: unpinned. │
│ │ │ Verdict: Checksum disabled; sources │
│ │ │ replaced with content from an unknown, │
│ │ │ never-before-seen domain. │
├─────────────────┼──────────────┼───────────────────────────────────────────┤
│ obsidian-beta │ 15/100 │ INCONCLUSIVE. Only 2 prior observations; │
│ │ │ no high-severity signals from a cold DB. │
└─────────────────┴──────────────┴───────────────────────────────────────────┘
```
分层的证据展示是其差异化所在:每个信号(规则、分类、新颖性、锁定、验证)都会显示其贡献和严重程度。你可以看到得分**为什么**是这样的。
## 它能捕获什么 / 它无法做到什么
| TrustSight 检测到的内容 | 超出 TrustSight 范围的内容 |
|---|---|
| **粗心的恶意行为**:`curl \| bash`、`base64 \| sh`、wget pipe sh(R001 召回率约 100%)。混淆的大小写、函数体中嵌入的 URL。 | **签名的上游 payload**:PKGBUILD 不是二进制文件。一个无害的构建文件可能会获取被篡改的发布 tarball。 |
| **结构性风险**:校验和被禁用(R004)、校验和被清空(R005)、URL 仿冒(`githab.com`)、未更新版本号即替换 source URL(C003)。 | **刻意使其平淡无奇的 PKGBUILD**:没有添加命令、没有新 URL、没有校验和更改;没有信号。这种更新对 diff 分析是不可见的。 |
| **基于历史的异常**:首次出现的 URL(全局或按包)、首次出现的维护者、在观察计数较低时给出 INCONCLUSIVE( inconclusive,结论不明确)判定。 | **构建依赖攻击**:恶意的 `makedepends` 或 `depends` 超出了 PKGBUILD 的范围。TrustSight 审查的是构建方案,而不是供应链的二阶依赖。 |
| **审查者操纵**:Unicode 双向覆盖(R013,88% 召回率),使显示的文本与执行的文本不同。注释/描述中的 Prompt 注入(R012,17% 召回率;作为绊线保留;主要防御手段是判定完整性断言)。 | **未锁定的源**会导致 INCONCLUSIVE。没有校验和、tag 或 commit 锁定的 `source=($pkgname-$pkgver.tar.gz)` 会被报告为结构性薄弱,而不是被默默接受。 |
## 安装
```
pip install trustsight
```
AUR:`trustsight`(dogfood:TrustSight 审查它自己的更新)。
从源码构建:
```
git clone https://github.com/emiliano-go/trustsight
cd trustsight
pip install -e .
```
需要 **Python 3.12+**。
## 命令
| 命令 | 作用 |
|---|---|
| [`trustsight review`](docs/reference/cli.md) | 扫描所有过期的 AUR 软件包,并生成带有分层证据的评分表。 |
| [`trustsight inspect `](docs/reference/cli.md) | 深入分析单个软件包:完整的得分明细、source URL、解析的命令、新颖性上下文。 |
| [`trustsight history `](docs/reference/cli.md) | 显示软件包过去的分析结果,带有可选的 `--score-breakdown`。 |
## 评分原理
评分是确定性的:相同的输入始终产生相同的分数。13 个核心检测规则(R001 到 R013)和 3 个代码结构规则(C001 到 C003)在四个证据层级产生信号:**A**(结构性,针对 PKGBUILD 行的规则)、**B**(先验/上下文,URL 分类和 forge 信任)、**C**(历史/新颖性,由观察计数控制的首次出现的 URL 和维护者)以及 **D**(验证,checksum、PGP key、GPG verify,这些会从分数中**扣除**)。LLM 完全是可选的,并且从不参与计算;它只是将确定性的明细翻译成英文,并且判定完整性断言会控制其输出。请参阅 [scoring-philosophy.md](docs/explanation/scoring-philosophy.md)。
## 安全模型
TrustSight 用于生成证据,而不是证明安全性。它只进行审查,不进行安装。该工具从不运行 PKGBUILD,从不执行提取的命令,也从不修改你的系统。每一个发现都可以追溯到特定的 diff 行、URL 或新颖性记录。输出的是结构化的风险评估,旨在为你的决策提供信息,而不是一道关卡。请参阅 [trust-model.md](docs/explanation/trust-model.md)。
## 许可证
MIT。特意采取宽松许可,以鼓励 Arch Linux 和安全社区的采用、审查和分支调查。
## 文档中心
| 部分 | 描述 |
|---|---|
| [快速入门](docs/getting-started/) | 从安装到首次审查的一站式教程 |
| [完整文档](docs/index.md) | 文档主页 |
| [贡献指南](CONTRIBUTING.md) | 如何报告 bug、贡献代码、改进文档 |
| [安全](docs/security.md) | 漏洞披露政策 |
| [许可证](docs/license.md) | MIT 完整文本 |
在你更新之前审查 AUR PKGBUILD:捕获粗心的恶意行为和结构性风险,并告知你它无法验证的内容。
## 30 秒示例
```
trustsight review
```
```
TrustSight Review
┏━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ Package ┃ Risk Score ┃ Verdict ┃
┃ ┃ ┃ ┃
┡━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩
│ chez-scheme-bin │ 0/100 │ Version bump. No structural changes. │
├─────────────────┼──────────────┼───────────────────────────────────────────┤
│ sketchy-pkg │ 35/100 │ R004 HIGH Checksum disabled (SKIP). │
│ │ │ C003 INFO Source URL changed without │
│ │ │ version bump. │
│ │ │ SOURCE_BUCKET MEDIUM New domain: │
│ │ │ sketchy-cdn.invalid (unknown). │
│ │ │ NOVELTY HIGH Source URL first seen │
│ │ │ globally. │
│ │ │ PINNING INFO Source pinning: unpinned. │
│ │ │ Verdict: Checksum disabled; sources │
│ │ │ replaced with content from an unknown, │
│ │ │ never-before-seen domain. │
├─────────────────┼──────────────┼───────────────────────────────────────────┤
│ obsidian-beta │ 15/100 │ INCONCLUSIVE. Only 2 prior observations; │
│ │ │ no high-severity signals from a cold DB. │
└─────────────────┴──────────────┴───────────────────────────────────────────┘
```
分层的证据展示是其差异化所在:每个信号(规则、分类、新颖性、锁定、验证)都会显示其贡献和严重程度。你可以看到得分**为什么**是这样的。
## 它能捕获什么 / 它无法做到什么
| TrustSight 检测到的内容 | 超出 TrustSight 范围的内容 |
|---|---|
| **粗心的恶意行为**:`curl \| bash`、`base64 \| sh`、wget pipe sh(R001 召回率约 100%)。混淆的大小写、函数体中嵌入的 URL。 | **签名的上游 payload**:PKGBUILD 不是二进制文件。一个无害的构建文件可能会获取被篡改的发布 tarball。 |
| **结构性风险**:校验和被禁用(R004)、校验和被清空(R005)、URL 仿冒(`githab.com`)、未更新版本号即替换 source URL(C003)。 | **刻意使其平淡无奇的 PKGBUILD**:没有添加命令、没有新 URL、没有校验和更改;没有信号。这种更新对 diff 分析是不可见的。 |
| **基于历史的异常**:首次出现的 URL(全局或按包)、首次出现的维护者、在观察计数较低时给出 INCONCLUSIVE( inconclusive,结论不明确)判定。 | **构建依赖攻击**:恶意的 `makedepends` 或 `depends` 超出了 PKGBUILD 的范围。TrustSight 审查的是构建方案,而不是供应链的二阶依赖。 |
| **审查者操纵**:Unicode 双向覆盖(R013,88% 召回率),使显示的文本与执行的文本不同。注释/描述中的 Prompt 注入(R012,17% 召回率;作为绊线保留;主要防御手段是判定完整性断言)。 | **未锁定的源**会导致 INCONCLUSIVE。没有校验和、tag 或 commit 锁定的 `source=($pkgname-$pkgver.tar.gz)` 会被报告为结构性薄弱,而不是被默默接受。 |
## 安装
```
pip install trustsight
```
AUR:`trustsight`(dogfood:TrustSight 审查它自己的更新)。
从源码构建:
```
git clone https://github.com/emiliano-go/trustsight
cd trustsight
pip install -e .
```
需要 **Python 3.12+**。
## 命令
| 命令 | 作用 |
|---|---|
| [`trustsight review`](docs/reference/cli.md) | 扫描所有过期的 AUR 软件包,并生成带有分层证据的评分表。 |
| [`trustsight inspect 标签:Arch Linux, AUR, Python, 云安全监控, 包管理, 无后门, 逆向工具, 静态分析