rostradamus/klaws
GitHub: rostradamus/klaws
一款扫描源代码以检测韩国多项法律(PIIPA、网络法等)合规风险并将结果映射到具体法律条款的 MCP 服务器与 CLI 工具。
Stars: 1 | Forks: 0
# klaws
[](https://github.com/rostradamus/klaws/actions/workflows/ci.yml)
[](https://github.com/rostradamus/klaws/releases/latest)
[](https://github.com/rostradamus/klaws/pkgs/container/klaws)
[](https://glama.ai/mcp/servers/rostradamus/klaws)
[](LICENSE)
[한국어](README.ko.md)
适用于代码库的韩国法律合规风险扫描器。它通过扫描源代码来查找可能暗示存在韩国法律合规风险的模式,并将发现的问题映射到具体的法律条款。它既可以作为 [MCP](https://modelcontextprotocol.io/) 服务器运行(以便 AI 编程助手按需进行扫描),也可以作为独立的 CLI 运行。
目前涵盖 [PIPA](https://www.law.go.kr/법령/개인정보보호법)(个人信息保护法)、[《网络法》](https://www.law.go.kr/법령/정보통신망이용촉진및정보보호등에관한법률)(정보통신망법)、[《信用信息法》](https://www.law.go.kr/법령/신용정보의이용및보호에관한법률)(신용정보법)以及 [《电子商务法》](https://www.law.go.kr/법령/전자상거래등에서의소비자보호에관한법률)(전자상거래법)。
## 快速开始
```
# 使用 Docker 扫描当前目录 — 无需安装
docker run --rm -v "$PWD":/src:ro ghcr.io/rostradamus/klaws scan /src
# ...或者,如果您已安装二进制文件:
klaws scan ./my-project # scan a directory
klaws scan ./MyService.java # scan a single file
```
## 安装
### Docker(推荐)
无需任何工具链——该镜像发布在 GitHub Container Registry 上,并且在 macOS、Linux 和 Windows 上的运行方式完全相同:
```
# 扫描当前目录(以只读方式挂载到 /src)
docker run --rm -v "$PWD":/src:ro ghcr.io/rostradamus/klaws scan /src
# 固定版本,而不是使用浮动的 latest tag
docker run --rm -v "$PWD":/src:ro ghcr.io/rostradamus/klaws:0.1.5 scan /src
```
### 预编译二进制文件
从 [最新发布版](https://github.com/rostradamus/klaws/releases/latest) 下载适用于您平台的压缩包,解压后将 `klaws` 移动到您的 `PATH` 路径下。
### go install
```
go install github.com/rostradamus/klaws/cmd/klaws@latest
```
### 从源码构建
**前置要求:** Go 1.23+
```
git clone https://github.com/rostradamus/klaws.git
cd klaws
go build -o klaws ./cmd/klaws/
```
验证安装:
```
klaws --version
```
## 用法
### 扫描
```
# 扫描目录(默认:*.java 文件)
klaws scan ./src
# 扫描特定文件类型
klaws scan ./src --pattern "*.kt"
# 文本输出(默认为 JSON)
klaws scan ./src --format text
# SARIF 输出(用于 GitHub code scanning / 其他工具)
klaws scan ./src --format sarif > klaws.sarif
# 如果任何 finding 的严重程度达到或超过指定级别,则使命令失败(exit 1)
klaws scan ./src --fail-on HIGH
# 使用自定义 laws 文件
klaws scan ./src --laws ./my-laws.yaml
```
### 输出示例
```
klaws scan report
Target: ./testdata
Files: 4
Findings: 7
--- Finding 1 ---
Detector: PIPA-CST-001
Risk: HIGH
Location: testdata/MemberController.java:10
Snippet: @PostMapping("/register")
Message: Endpoint accepts possible personal data without apparent consent
mechanism — may require review under PIPA Article 15
Laws: PIPA-15
--- Finding 2 ---
Detector: PIPA-ENC-001
Risk: HIGH
Location: testdata/MemberEntity.java:11
Snippet: private String residentNumber;
Message: Possible unencrypted personal identifier (residentNumber) — may
require review under PIPA Article 24-2
Laws: PIPA-24-2, PIPA-29
--- Finding 3 ---
Detector: PIPA-LOG-001
Risk: MEDIUM
Location: testdata/UserService.java:11
Snippet: log.info("User registered: " + email);
Message: Possible personal data (email) in log output — may require review
under PIPA Article 29
Laws: PIPA-29
```
### 查询法律条款
```
# 从 bundled database 中查找
klaws law PIPA-15
# 从 law.go.kr 获取实时文本
klaws law PIPA-15 --live
```
### 列出检测器
```
klaws detectors
```
```
[
{
"id": "PIPA-LOG-001",
"name": "Personal Data Logging Risk",
"description": "Detects log statements that may contain personal data fields",
"related_laws": ["PIPA-29"]
},
{
"id": "PIPA-ENC-001",
"name": "Unencrypted Personal Data Risk",
"description": "Detects personal identifier fields stored without apparent encryption",
"related_laws": ["PIPA-24-2", "PIPA-29"]
},
{
"id": "PIPA-CST-001",
"name": "Missing Consent Check Risk",
"description": "Detects endpoints accepting personal data without apparent consent verification",
"related_laws": ["PIPA-15"]
}
]
```
## 检测器
| ID | 名称 | 检测目标 | 风险 | 相关法律 |
|----|------|-------------------|------|-------------|
| `PIPA-LOG-001` | 个人数据日志记录 | 包含个人数据字段名(email、phone、SSN、password)的 `log.*()` 调用 | MEDIUM | PIPA 第 29 条 |
| `PIPA-ENC-001` | 未加密的个人数据 | 缺少加密注解或调用的敏感标识符字段(resident number、SSN) | HIGH | PIPA 第 24-2 条、第 29 条 |
| `PIPA-CST-001` | 缺少同意检查 | 接收个人数据但未进行同意验证的 `@PostMapping`/`@PutMapping` endpoint | HIGH | PIPA 第 15 条 |
| `NIA-MKT-001` | 营销信息同意 | 发送广告/营销信息(`send`/`push`)但未进行明显的 opt-in 同意检查 | MEDIUM | 《网络法》第 50 条 |
| `CIA-ENC-001` | 未受保护的信用信息 | 未加密或脱敏的信用/财务标识符字段(card number、account number、credit score) | HIGH | 《信用信息法》第 19 条 |
| `ECA-RET-001` | 交易记录留存 | 存储交易记录字段(order/payment ID)但未进行明显的留存或保留处理 | MEDIUM | 《电子商务法》第 6 条 |
| `PIPA-RET-001` | 个人数据留存 | 存储个人数据字段(email、phone、resident number)但未进行明显的销毁或留存期限处理 | MEDIUM | PIPA 第 21 条 |
| `PIPA-XBR-001` | 第三方数据传输 | 在未进行明显同意检查的情况下,将个人数据发送至第三方或外部 endpoint(对外部 URL/合作伙伴的出站调用) | HIGH | PIPA 第 17 条 |
检测器使用基于正则表达式的模式匹配。它们支持英文和韩文字段名(例如:`email`/`이메일`、`residentNumber`/`주민번호`、`consent`/`동의`)。
## MCP 服务器
klaws 可以作为 [MCP](https://modelcontextprotocol.io/) 服务器运行,从而将其扫描功能提供给 AI 编程助手使用。
```
klaws serve
```
### 可用工具
| 工具 | 描述 |
|------|-------------|
| `scan_directory` | 扫描目录以查找合规风险 |
| `scan_file` | 扫描单个文件 |
| `list_detectors` | 列出所有可用的检测器 |
| `get_law_reference` | 通过 ID 查询韩国法律条款 |
### 配置
所有客户端都使用相同的启动命令:通过 stdio 运行 `klaws serve`。请使用该二进制文件的绝对路径(运行 `which klaws`,或在 Windows 上运行 `where klaws` 来查找),或者如果它已经在您的 `PATH` 中,直接使用 `klaws` 即可。不想安装任何东西?使用下方的 [Docker 变体](#run-the-mcp-server-via-docker)——它可以在任何支持 stdio MCP 服务器的客户端中运行。
**Claude Code** — `~/.claude/settings.json`:
```
{
"mcpServers": {
"klaws": {
"command": "klaws",
"args": ["serve"]
}
}
}
```
或者通过单条命令添加:
```
claude mcp add klaws -- klaws serve
```
**Claude Desktop** — `claude_desktop_config.json`(设置 → 开发者 → 编辑配置):
```
{
"mcpServers": {
"klaws": {
"command": "klaws",
"args": ["serve"]
}
}
}
```
**Cursor** — `~/.cursor/mcp.json`(或项目中的 `.cursor/mcp.json`):
```
{
"mcpServers": {
"klaws": {
"command": "klaws",
"args": ["serve"]
}
}
}
```
**VS Code** — `.vscode/mcp.json`:
```
{
"servers": {
"klaws": {
"command": "klaws",
"args": ["serve"]
}
}
}
```
连接成功后,您可以向助手发出类似这样的指令:“使用 klaws 扫描此目录中的韩国合规风险”。
#### 通过 Docker 运行 MCP 服务器
无需安装二进制文件——将 `command`/`args` 替换为 `docker run`,并挂载您想要扫描的代码即可。`-i` 标志会为 stdio 传输保持标准输入开启;`--scan-root /src` 会将扫描范围限制在挂载的目录内:
```
{
"mcpServers": {
"klaws": {
"command": "docker",
"args": [
"run", "--rm", "-i",
"-v", "/absolute/path/to/your/project:/src:ro",
"ghcr.io/rostradamus/klaws:0.1.5",
"serve", "--scan-root", "/src"
]
}
}
}
```
让助手指向 `/src`(容器端的挂载点)下的路径,例如:“扫描 /src 的韩国合规风险”。
### 远程(Streamable HTTP)
默认情况下,`klaws serve` 使用 stdio(本地)。要通过 HTTP 将其作为远程 MCP 服务器运行,请传入 `--http` 参数:
```
klaws serve --http :8080
# 或通过已发布的 container image:
docker run --rm -p 8080:8080 ghcr.io/rostradamus/klaws serve --http :8080
```
随后,MCP endpoint 将可以通过 `http://:8080/mcp`(Streamable HTTP 传输)访问。将支持 HTTP 的 MCP 客户端指向该 URL 即可。
#### 保护远程服务器
```
klaws serve --http :8080 \
--auth-token "$(openssl rand -hex 32)" \
--scan-root /workspace
```
- `--auth-token ` — 要求每个 HTTP 请求都带有 `Authorization: Bearer `;未认证的请求将返回 `401`。也可以通过 `KLAWS_AUTH_TOKEN` 环境变量提供。仅适用于 `--http` 模式。
- `--scan-root ` — 将 `scan_directory` / `scan_file` 限制在 `` 路径内;对该路径之外的请求将被拒绝。(在 stdio 模式下同样适用。)
## 内置法律条款
klaws 在其二进制文件中内置了 4 项韩国法律下的 40 项条款(无需外部文件):
### PIPA(个人信息保护法) — 10 项条款
| ID | 条款 | 主题 |
|----|---------|-------|
| `PIPA-15` | 第 15 条 | 个人信息的收集和使用 |
| `PIPA-17` | 第 17 条 | 向第三方提供 |
| `PIPA-18` | 第 18 条 | 超出目的的使用限制 |
| `PIPA-21` | 第 21 条 | 个人信息的销毁 |
| `PIPA-23` | 第 23 条 | 敏感信息的限制 |
| `PIPA-24` | 第 24 条 | 唯一识别信息的限制 |
| `PIPA-24-2` | 第 24-2 条 | 居民登记号码的限制 |
| `PIPA-29` | 第 29 条 | 安全保障义务 |
| `PIPA-30` | 第 30 条 | 隐私政策 |
| `PIPA-34` | 第 34 条 | 数据泄露通知 |
### 《网络法》(정보통신망법) — 11 项条款
| ID | 条款 | 主题 |
|----|---------|-------|
| `NIA-22` | 第 22 条 | 收集/使用个人信息的同意 |
| `NIA-23` | 第 23 条 | 收集的限制 |
| `NIA-23-2` | 第 23-2 条 | 居民登记号码的限制 |
| `NIA-24` | 第 24 条 | 使用的限制 |
| `NIA-24-2` | 第 24-2 条 | 向第三方提供 |
| `NIA-27` | 第 27 条 | 安全措施 |
| `NIA-28` | 第 28 条 | 个人信息的委托处理 |
| `NIA-28-2` | 第 28-2 条 | 数据泄露通知 |
| `NIA-44` | 第 44 条 | 用户保护 |
| `NIA-44-7` | 第 44-7 条 | 禁止非法信息 |
| `NIA-50` | 第 50 条 | 广告信息发送的限制 |
### 《信用信息法》(신용정보법) — 10 项条款
| ID | 条款 | 主题 |
|----|---------|-------|
| `CIA-15` | 第 15 条 | 收集原则 |
| `CIA-17` | 第 17 条 | 禁止超出目的的披露 |
| `CIA-19` | 第 19 条 | 信用信息系统的安全 |
| `CIA-20` | 第 20 条 | 信用信息的准确性和时效性 |
| `CIA-32` | 第 32 条 | 提供/使用的同意 |
| `CIA-33` | 第 33 条 | 个人信用信息的使用 |
| `CIA-34` | 第 34 条 | 个人信用信息的提供/使用 |
| `CIA-38` | 第 38 条 | 信用信息的保护 |
| `CIA-39` | 第 39 条 | 数据泄露通知 |
| `CIA-40` | 第 40 条 | 信用信息主体的权利 |
### 《电子商务法》(전자상거래법) — 9 项条款
| ID | 条款 | 主题 |
|----|---------|-------|
| `ECA-6` | 第 6 条 | 交易记录的保存 |
| `ECA-7` | 第 7 条 | 防止操作错误 |
| `ECA-11` | 第 11 条 | 电子支付的可靠性 |
| `ECA-13` | 第 13 条 | 身份与交易信息的提供 |
| `ECA-14` | 第 14 条 | 订单确认 |
| `ECA-17` | 第 17 条 | 撤回权 |
| `ECA-21` | 第 21 条 | 消费者信息的使用 |
| `ECA-24` | 第 24 条 | 网络商城安全 |
| `ECA-26` | 第 26 条 | 消费者信息的保护 |
包含完整的韩文条款文本。使用 `--live` 可从 [law.go.kr](https://www.law.go.kr) 获取最新版本。
## 隐私与安全
klaws 在设计上确保了指向私有代码的安全性:
- **仅限本地分析。** 扫描纯粹是对您传入的文件进行静态模式匹配。源代码永远不会离开您的机器——不会上传任何内容,也不会进行远程记录或发送给任何服务。
- **一个可选的出站调用。** klaws 唯一发出的网络请求是 `--live` 法律查询(CLI)或带有实时抓取功能的 `get_law_reference`(MCP),它会从 [law.go.kr](https://www.law.go.kr) 获取公共法规文本。它仅发送法规名称(例如:根据您查询的条款解析出的 `개인정보보호법`)作为搜索查询——绝不会发送您的代码。省略 `--live` 即可保持完全离线。
- **设计上为只读。** klaws 只会读取它扫描的文件;它永远不会修改您的代码。它的 MCP 工具被标记为只读。
- **限制可访问的文件系统。** 在公开 MCP 服务器时,传入 `--scan-root ` 以将 `scan_directory`/`scan_file` 限制在单个目录树中,并在通过 `--http` 提供服务时传入 `--auth-token`。请参阅[保护远程服务器](#securing-a-remote-server)。
如需报告漏洞,请参阅 [URITY.md](SECURITY.md)。
## 架构
```
klaws scan ./src
│
▼
FileWalker ──► walks directory, matches glob pattern
│
▼
ScannerService ──► reads each file
│
▼
DetectorRegistry ──► runs all detectors on source code
│
▼
Findings ──► mapped to law provisions
│
▼
Report ──► JSON or text output
```
## 路线图
- **更多检测器:** 营销信息同意 (NIA-MKT-001) *(已完成)*、未受保护的信用信息 (CIA-ENC-001) *(已完成)*、交易记录留存 (ECA-RET-001) *(已完成)*、个人数据留存 (PIPA-RET-001) *(已完成)*、第三方/跨境传输 (PIPA-XBR-001) *(已完成)*
- **多语言支持:** Python、JavaScript/TypeScript 检测模式
- **更多韩国法律:** 《电子商务法》(전자상거래법) 消费者保护规则 *(已完成)*、《网络法》(정보통신망법) *(已完成)*、《信用信息法》(신용정보법) *(已完成)*
- **CI/CD:** GitHub Action、SARIF 输出、严重性阈值 *(已完成)*
- **配置:** 通过配置文件自定义模式规则
## GitHub Action (CI)
klaws 提供了一个复合 action,它可以扫描您的代码并生成 SARIF 报告,您可以将其上传到 GitHub 代码扫描功能中,从而在 pull request 和 **Security**(安全)选项卡中内联显示发现的问题。
```
# .github/workflows/klaws.yml
name: klaws compliance scan
on: [pull_request]
permissions:
contents: read
security-events: write # required to upload SARIF
jobs:
scan:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- id: klaws
uses: rostradamus/klaws@v0.1.5
with:
path: ./src
pattern: "*.java"
fail-on: none # or MEDIUM / HIGH to gate the PR
version: v0.1.5
- name: Upload SARIF
if: always() # upload even if fail-on tripped the step
uses: github/codeql-action/upload-sarif@v3
with:
sarif_file: ${{ steps.klaws.outputs.sarif }}
```
设置 `fail-on: HIGH`(或 `MEDIUM`),以便在存在该严重级别或更高严重级别的发现时,使检查失败并阻断 PR。上传步骤中的 `if: always()` 确保了即使拦截失败,SARIF 报告依然会被发布。
## 发布
维护者:请参阅 [RELEASE.md](RELEASE.md) 了解如何发布新版本并发布到 MCP registry。
## 许可证
MIT
标签:DevSecOps, EVTX分析, MCP Server, 上游代理, 个人隐私保护, 合规扫描, 图探索, 日志审计, 请求拦截, 错误基检测, 静态代码分析, 韩国法规