内容
# 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)
[](LICENSE)
韩国法律合规风险扫描器,用于扫描代码库中的合规风险模式,并将发现结果映射到特定的法律条款。目前涵盖《个人信息保护法》(PIPA)、《网络法》(Network Act)、《信用信息法》(Credit Information Act)和《电子商务法》(E-Commerce Act)。
> **免责声明:** klaws识别可能的风险以供审查,但不构成法律建议。如需确定指导,请咨询合格的法律顾问。
> **隐私:** klaws在本地分析代码,不进行任何网络传输。唯一的出站网络调用是可选的 `--live` 法律查询,访问 [law.go.kr](https://www.law.go.kr);如果不使用该标志,则完全离线。
## 快速开始
```bash
# 使用Docker扫描当前目录 - 无需安装
docker run --rm -v "$PWD":/src:ro ghcr.io/rostradamus/klaws scan /src
# ... 或者,如果您已安装二进制文件:
klaws scan ./my-project # 扫描目录
klaws scan ./MyService.java # 扫描单个文件
```
## 安装
### Docker(推荐)
无需工具链 - 镜像发布到GitHub容器注册表,在macOS、Linux和Windows上均可使用:
```bash
# 扫描当前目录(只读挂载到/src)
docker run --rm -v "$PWD":/src:ro ghcr.io/rostradamus/klaws scan /src
# 指定版本而不是使用最新的浮动标签
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
```bash
go install github.com/rostradamus/klaws/cmd/klaws@latest
```
### 从源代码编译
**要求:** Go 1.23+
```bash
git clone https://github.com/rostradamus/klaws.git
cd klaws
go build -o klaws ./cmd/klaws/
```
验证安装:
```bash
klaws --version
```
## 用法
### 扫描
```bash
# 扫描目录(默认:*.java文件)
klaws scan ./src
# 扫描特定类型的文件
klaws scan ./src --pattern "*.kt"
# 文本输出(默认是JSON)
klaws scan ./src --format text
# SARIF输出(用于GitHub代码扫描/其他工具)
klaws scan ./src --format sarif > klaws.sarif
# 如果发现结果达到或超过某个严重级别,则使命令失败(退出状态码1)
klaws scan ./src --fail-on HIGH
# 使用自定义法律文件
klaws scan ./src --laws ./my-laws.yaml
```
### 示例输出
```
klaws scan report
目标: ./testdata
文件: 4
发现结果: 7
--- 发现结果 1 ---
检测器: PIPA-CST-001
风险: 高
位置: testdata/MemberController.java:10
代码片段: @PostMapping("/register")
消息: 端点接受可能的个人数据,但没有明显的同意机制 - 可能需要根据《个人信息保护法》第15条进行审查
法律: PIPA-15
--- 发现结果 2 ---
检测器: PIPA-ENC-001
风险: 高
位置: testdata/MemberEntity.java:11
代码片段: private String residentNumber;
消息: 可能的未加密个人标识符(residentNumber)- 可能需要根据《个人信息保护法》第24-2条进行审查
法律: PIPA-24-2, PIPA-29
--- 发现结果 3 ---
检测器: PIPA-LOG-001
风险: 中等
位置: testdata/UserService.java:11
代码片段: log.info("User registered: " + email);
消息: 可能的个人数据(email)在日志输出中 - 可能需要根据《个人信息保护法》第29条进行审查
法律: PIPA-29
```
### 查询法律条款
```bash
# 从捆绑数据库查询
klaws law PIPA-15
# 从law.go.kr获取实时文本
klaws law PIPA-15 --live
```
### 列出检测器
```bash
klaws detectors
```
```json
[
{
"id": "PIPA-LOG-001",
"name": "个人数据日志记录风险",
"description": "检测可能包含个人数据字段的日志语句",
"related_laws": ["PIPA-29"]
},
{
"id": "PIPA-ENC-001",
"name": "未加密的个人数据风险",
"description": "检测存储敏感标识符字段而没有加密注释或调用",
"related_laws": ["PIPA-24-2", "PIPA-29"]
},
{
"id": "PIPA-CST-001",
"name": "缺少同意检查风险",
"description": "检测接受个人数据而没有同意验证的端点",
"related_laws": ["PIPA-15"]
}
]
```
## 检测器
| ID | 名称 | 检查内容 | 风险 | 相关法律 |
|----|------|-------------------|------|-------------|
| `PIPA-LOG-001` | 个人数据日志记录 | `log.*()` 调用包含个人数据字段名称(email, phone, SSN, password) | 中等 | PIPA 第29条 |
| `PIPA-ENC-001` | 未加密的个人数据 | 敏感标识符字段(resident number, SSN)而没有加密注释或调用 | 高 | PIPA 第24-2条, 29 |
| `PIPA-CST-001` | 缺少同意检查 | `@PostMapping`/`@PutMapping` 端点接受个人数据而没有同意验证 | 高 | PIPA 第15条 |
| `NIA-MKT-001` | 营销信息同意 | 广告/营销信息调度(`send`/`push`)而没有明显的同意检查 | 中等 | 网络法 第50条 |
| `CIA-ENC-001` | 未保护的信用信息 | 信用/金融标识符字段(card number, account number, credit score)而没有加密或掩码 | 高 | 信用信息法 第19条 |
| `ECA-RET-001` | 交易记录保留 | 交易记录字段(order/payment IDs)存储而没有明显的保留或保存处理 | 中等 | 电子商务法 第6条 |
| `PIPA-RET-001` | 个人数据保留 | 个人数据字段(email, phone, resident number)存储而没有明显的销毁或保留限制处理 | 中等 | PIPA 第21条 |
| `PIPA-XBR-001` | 第三方数据传输 | 个人数据发送到第三方或外部端点(出站调用到外部URL/合作伙伴)而没有明显的同意检查 | 高 | PIPA 第17条 |
检测器使用基于正则表达式的模式匹配。它们支持英文和韩文字段名称(例如,`email`/`이메일`,`residentNumber`/`주민번호`,`consent`/`동의`)。
## MCP服务器
klaws可以作为一个MCP服务器,使其扫描能力可用于AI编码助手。
```bash
klaws serve
```
### 可用工具
| 工具 | 描述 |
|------|-------------|
| `scan_directory` | 扫描目录的合规风险 |
| `scan_file` | 扫描单个文件的合规风险 |
| `list_detectors` | 列出所有可用的检测器 |
| `get_law_reference` | 按ID查找韩国法律条款 |
### 配置
所有客户端都使用相同的启动命令:`klaws serve` 通过stdio。使用二进制文件的绝对路径(运行 `which klaws` 或 `where klaws` 在Windows上),或如果它在您的 `PATH`中,则直接使用 `klaws`。如果不想安装任何东西?使用下面的 [Docker变体](#使用docker运行mcp服务器) - 它适用于任何支持stdio的MCP客户端。
**Claude Code** - `~/.claude/settings.json`:
```json
{
"mcpServers": {
"klaws": {
"command": "klaws",
"args": ["serve"]
}
}
}
```
或添加以下命令:
```bash
claude mcp add klaws -- klaws serve
```
**Claude Desktop** - `claude_desktop_config.json`(设置 → 开发者 → 编辑配置):
```json
{
"mcpServers": {
"klaws": {
"command": "klaws",
"args": ["serve"]
}
}
}
```
**Cursor** - `~/.cursor/mcp.json`(或 `.cursor/mcp.json` 在项目中):
```json
{
"mcpServers": {
"klaws": {
"command": "klaws",
"args": ["serve"]
}
}
}
```
**VS Code** - `.vscode/mcp.json`:
```json
{
"servers": {
"klaws": {
"command": "klaws",
"args": ["serve"]
}
}
}
```
连接后,询问您的助手类似 *"使用klaws扫描此目录的韩国合规风险。"*
#### 使用Docker运行MCP服务器
无需安装二进制文件 - 交换 `command`/`args` 为 `docker run` 以挂载您要扫描的代码。 `-i` 标志保持stdin打开以进行stdio传输; `--scan-root /src` 将扫描限制在挂载的目录内:
```json
{
"mcpServers": {
"klaws": {
"command": "docker",
"args": [
"run", "--rm", "-i",
"-v", "/绝对路径/到您的项目:/src:ro",
"ghcr.io/rostradamus/klaws:0.1.5",
"serve", "--scan-root", "/src"
]
}
}
}
```
将助手指向 `/src` 下的路径(容器侧挂载),例如 *"扫描 /src 的韩国合规风险。"*
### 远程(可流式HTTP)
默认情况下,`klaws serve` 使用stdio(本地)。要将其作为远程MCP服务器运行在HTTP上,请传递 `--http`:
```bash
klaws serve --http :8080
# 或通过发布的容器镜像:
docker run --rm -p 8080:8080 ghcr.io/rostradamus/klaws serve --http :8080
```
MCP端点现在可在 `http://<host>:8080/mcp`(流式HTTP传输)处访问。指向支持HTTP的MCP客户端到该URL。
#### 安全远程服务器
```bash
klaws serve --http :8080 \
--auth-token "$(openssl rand -hex 32)" \
--scan-root /workspace
```
- `--auth-token <token>` - 每个HTTP请求都需要 `Authorization: Bearer <token>`;未经身份验证的请求会收到 `401`。也可以通过 `KLAWS_AUTH_TOKEN` 环境变量提供。仅适用于 `--http`。
- `--scan-root <dir>` - 限制 `scan_directory` / `scan_file` 在 `<dir>` 内;对外部路径的请求被拒绝。(在stdio模式下也适用。)
> **注意:**
> - `--auth-token` 提供Bearer身份验证,但 **不提供TLS**。对于不受信任的网络,请在klaws前面使用反向代理/网关。
> - `scan_directory` 和 `scan_file` 工具读取 **服务器的** 文件系统(传递的路径在运行klaws的主机上解析)。远程扫描时,在哪里运行klaws并设置 `--scan-root` 到该checkout。 `get_law_reference` 和 `list_detectors` 工具没有文件系统依赖。
## 捆绑的法律条款
klaws 配备了 40 条法律条款,跨越 4 部韩国法律,嵌入二进制文件(不需要外部文件):
### 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-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` 获取最新的版本。
## 隐私和安全
klaws 设计为对私有代码安全:
- **仅本地分析**。扫描是您传递的文件的纯静态模式匹配。源代码永远不会离开您的机器 - 不会上传任何内容,也不会远程记录或发送到任何服务。
- **一个可选的出站调用**。唯一的网络请求是 `--live` 法律查询(CLI)/ `get_law_reference` 实时获取(MCP),它发送的唯一内容是法律名称(例如 `개인정보보호법`,从您查找的条款解析)作为搜索查询 - 绝不发送您的代码。省略 `--live` 以保持完全离线。
- **设计为只读**。klaws 只读取它扫描的文件;它从不修改您的代码。其MCP工具被注释为只读。
- **限制可达文件系统**。在暴露MCP服务器时,请传递 `--scan-root <dir>` 以限制 `scan_directory`/`scan_file` 到单个树,并传递 `--auth-token` 以进行 `--http` 服务。
## 架构
```
klaws scan ./src
│
▼
FileWalker ──► 遍历目录,匹配glob模式
│
▼
ScannerService ──► 读取每个文件
│
▼
DetectorRegistry ──► 对源代码运行所有检测器
│
▼
Findings ──► 映射到法律条款
│
▼
Report ──► JSON 或文本输出
```
## 路线图
- **更多检测器**:营销信息同意(NIA-MKT-001)*(已完成)*,未受保护的信用信息(CIA-ENC-001)*(已完成)*,交易记录保留(ECA-RET-001)*(已完成)*,个人数据保留(PIPA-RET-001)*(已完成)*,第三方/跨境传输(PIPA-XBR-001)*(已完成)*
- **多语言支持**:Python,JavaScript/TypeScript 检测模式
- **更多韩国法律**:电子商务法(전자상거래법)消费者保护规则 *(已完成)*,网络法(정보통신망법) *(已完成)*,信用信息法(신용정보법) *(已完成)*
- **CI/CD**:GitHub Actions,SARIF 输出,严重性阈值 *(已完成)*
- **配置**:通过配置文件进行自定义模式规则
## GitHub Actions(CI)
klaws 配备了一个复合动作,扫描您的代码并生成 SARIF 报告,您可以将其上传到 GitHub 代码扫描,以便在拉取请求和 **安全** 选项卡中内联显示发现结果。
```yaml
# .github/workflows/klaws.yml
name: klaws 合规扫描
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`)设置为在存在该严重级别或以上的发现结果时使检查失败。如果 `if: always()` 位于上传步骤中,则确保即使门控失败,SARIF 也会被发布。
## 发布
维护者:请参阅 [RELEASE.md](RELEASE.md) 了解如何发布版本并发布到MCP注册表。
## 许可证
MIT
MCP 配置
以下是此 MCP Server 的配置信息,可直接复制到 Cursor 或其他 MCP 客户端中使用。
mcp.json
连接信息
猜你喜欢
暂无推荐服务器