rostradamus/klaws

GitHub: rostradamus/klaws

一款扫描源代码以检测韩国多项法律(PIIPA、网络法等)合规风险并将结果映射到具体法律条款的 MCP 服务器与 CLI 工具。

Stars: 1 | Forks: 0

# klaws [![CI](https://static.pigsec.cn/wp-content/uploads/repos/cas/ad/ad5834178f7599af9fdda11629d49cae07f2997beec49821b2920eff5bfd50e7.svg)](https://github.com/rostradamus/klaws/actions/workflows/ci.yml) [![Release](https://img.shields.io/github/v/release/rostradamus/klaws)](https://github.com/rostradamus/klaws/releases/latest) [![Container](https://img.shields.io/badge/ghcr.io-rostradamus%2Fklaws-blue?logo=docker)](https://github.com/rostradamus/klaws/pkgs/container/klaws) [![Glama](https://glama.ai/mcp/servers/rostradamus/klaws/badges/score.svg)](https://glama.ai/mcp/servers/rostradamus/klaws) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](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, 上游代理, 个人隐私保护, 合规扫描, 图探索, 日志审计, 请求拦截, 错误基检测, 静态代码分析, 韩国法规