安全决策报告

backlog

核心功能(Plane REST API操作、fix_plan.md管理)是合法工具,但包含两处未声明的高危阴影功能:K3s/Django Shell fallback可在Plane Pod内执行任意Python代码(filesystem:ADMIN + code_execution能力),以及intake.py/bulk_update.py从Windows注册表收割API密钥。

安装决策优先 来源: ClawHub 扫描时间: 2026/9/18
文件 18
IOC 13
越权项 3
发现 7
最直接的威胁证据
高危 代码执行
未声明的K3s/Django Shell fallback实现任意Python代码执行

plane_create_entity.py的create_via_k3s_fallback()和plane_update_entity.py的update_via_k3s_fallback()在REST API失败时,通过kubectl exec在Plane API Pod内执行Django shell,执行任意Python代码并对Plane DB执行ORM写操作。SKILL.md仅声明REST API集成,完全未提及K3s fallback能力。该路径等效于在Plane基础设施内部拥有代码执行权限。

scripts/plane_create_entity.py:397

为什么得出这个结论

2/4 个维度触发
阻止
声明与实际能力

发现 3 项声明之外的能力或越权行为。

复核
隐藏执行与外联

提取到 13 个一般风险产物,需要结合上下文判断。

阻止
攻击链与高危发现

报告包含 0 步攻击链,另有 3 项高危或严重发现。

通过
依赖与供应链卫生

依赖结构存在,但暂未看到明显高危告警。

风险分是怎么被拉高的

未声明的K3s/Django Shell fallback代码执行 +25

plane_create_entity.py与plane_update_entity.py包含kubectl exec进入Plane Pod执行Django Shell的fallback路径,SKILL.md完全未声明该能力,等效于filesystem:ADMIN + shell:WRITE + 代码执行权限

未声明的Windows注册表凭证收割 +10

intake.py和plane_bulk_update.py使用winreg访问Windows HKCU\Environment中的DGS_PLANE_API_KEY,SKILL.md未声明Windows凭证访问

K3s路径支持SSH tunnel跳转 +8

plane_create_entity.py和plane_update_entity.py的K3s命令可经SSH跳板执行,SSH凭证管理路径未声明

K3s fallback使用base64编码Python脚本 +5

通过base64.b64encode+subprocess执行Pod内Django Shell,脚本内容虽经json.dumps参数化,但base64编码执行路径本身是可疑模式

依赖第三方辅助模块workspace_profile +5

脚本依赖fix-plan技能的workspace_profile.py,存在跨skill隐式依赖,workspace_profile本身的安全由外部skill保证

硬编码默认fix_plan路径含明文用户目录 +2

intake.py包含C:\Users\DAEGUNSOFT\...硬编码路径,虽为合法默认值但不宜硬编码用户名

最关键的证据

高危 代码执行

未声明的K3s/Django Shell fallback实现任意Python代码执行

plane_create_entity.py的create_via_k3s_fallback()和plane_update_entity.py的update_via_k3s_fallback()在REST API失败时,通过kubectl exec在Plane API Pod内执行Django shell,执行任意Python代码并对Plane DB执行ORM写操作。SKILL.md仅声明REST API集成,完全未提及K3s fallback能力。该路径等效于在Plane基础设施内部拥有代码执行权限。

scripts/plane_create_entity.py:397
在SKILL.md allowed-tools中声明kubectl/k3s能力,或在文档中明确说明K3s fallback的安全前提(kubectl可用性、namespace/workload隔离)
高危 凭证窃取

未声明的Windows注册表API密钥访问

intake.py的get_api_key()和plane_bulk_update.py的get_api_key()在环境变量缺失时,尝试从Windows注册表HKCU\Environment读取DGS_PLANE_API_KEY。该行为未经用户授权确认,且未在任何文档中声明。

scripts/intake.py:23
移除winreg凭证收割路径,统一使用环境变量;或在SKILL.md中声明Windows凭据访问能力
高危 权限提升

K3s fallback可通过SSH跳板绕过kubeconfig路径

plane_create_entity.py:384-392支持k3s_ssh_host参数,通过SSH连接远程主机后执行kubectl。SSH凭证路径(环境变量或配置文件)未在代码中明确标注,且文档未声明SSH跳板访问能力。

scripts/plane_create_entity.py:384
文档化SSH跳板机制的安全前提(SSH密钥管理、known_hosts验证)
中危 文档欺骗

SKILL.md声明权限与实际能力显著不符

SKILL.md声明allowed-tools仅为Read/Edit/Write/Grep和Bash(gh:*)/Bash(python3:*),但代码实现包含:(1) Plane REST API的完整CRUD操作(网络WRITE);(2) K3s Pod内代码执行(shell WRITE/ADMIN);(3) Windows注册表读(environment READ);(4) 跨skill Python模块导入。

SKILL.md:17
更新SKILL.md allowed-tools声明,包含network:WRITE、shell:WRITE、environment:READ和kubectl相关能力
中危 代码混淆

K3s fallback使用base64编码绕过静态分析

plane_create_entity.py通过base64.b64encode(py_script)将Python代码base64编码后注入kubectl命令执行。虽编码有合理用途(传递含特殊字符的Python脚本),但该模式符合代码混淆高危指标特征。

scripts/plane_create_entity.py:403
考虑替代方案(如预置脚本文件),或在代码注释中明确说明base64的必要性
中危 供应链

跨skill隐式依赖workspace_profile模块

plane_client.py、plane_sync.py、plane_bulk_update.py依赖来自fix-plan技能的workspace_profile.py模块。backlog skill声明depends-on fix-plan,但实际依赖比声明更深(跨目录sys.path插入),且workspace_profile本身可能包含额外的K8s/SSH凭证访问逻辑。

scripts/plane_client.py:89
明确声明跨skill深度依赖;在fix-plan技能中审查workspace_profile.py的安全态势
低危 敏感访问

硬编码Windows用户路径

intake.py的DEFAULT_FIX_PLAN硬编码了C:\Users\DAEGUNSOFT\路径,虽为合法默认值但泄露了用户名信息,且不支持跨平台。

scripts/intake.py:20
改用Path.home()或环境变量动态构建路径

声明能力 vs 实际能力

文件系统 通过
声明 WRITE
→
推断 WRITE
SKILL.md声明Edit/Write,代码读写fix_plan.md/checklist.md
网络访问 阻止
声明 READ
→
推断 WRITE
plane_create_issue.py:通过Plane REST API POST创建issue,属WRITE级别
命令执行 阻止
声明 NONE
→
推断 WRITE
plane_create_entity.py:397-401 kubectl exec执行Django Shell; plane_update_entity.py类似
环境变量 阻止
声明 NONE
→
推断 READ
intake.py:23 os.environ.get('DGS_PLANE_API_KEY'); plane_bulk_update.py相同模式
技能调用 通过
声明 READ
→
推断 READ
SKILL.md声明depends-on fix-plan/todowrite/github-flow,实际通过sys.path跨目录导入共享模块

可疑产物与外联

中危 外部 URL
https://keepachangelog.com/en/1.0.0/

CHANGELOG.md:5

中危 外部 URL
https://semver.org/spec/v2.0.0.html

CHANGELOG.md:6

中危 外部 URL
https://plane.es6.kr/es6kr/projects/

comment.md:47

中危 外部 URL
https://plane.es6.kr/es6kr/projects/4b4d8bfc-5e5d-495b-bd4c-301fe89e5bb0/issues/86db2a42-172e-4413-98a2-9f5f704104e8

create.md:80

中危 外部 URL
https://plane.dgs.ai.kr/dgs/projects/

create.md:93

中危 外部 URL
https://plane.dgs.ai.kr/dgs/browse/

create.md:93

中危 外部 URL
https://plane.dgs.ai.kr/dgs/browse/INFRA-77

create.md:94

中危 外部 URL
https://plane.dgs.ai.kr/api/v1/workspaces/dgs

scripts/intake.py:21

中危 外部 URL
https://plane.es6.kr

scripts/test_plane_priority_mapping.py:40

中危 外部 URL
https://plane.example.com/myworkspace/projects/

scripts/test_plane_sync.py:26

中危 外部 URL
https://plane.example.com

scripts/test_plane_sync.py:83

中危 外部 URL
http://plane.example.com

scripts/test_plane_sync.py:461

依赖与供应链

包名版本来源漏洞备注
workspace_profile 未声明 跨skill导入(fix-plan技能) 否 非pip依赖,来自fix-plan技能目录;本身可能含K8s/SSH凭证逻辑,安全态势由外部保证
plane_client 未声明 本地scripts同目录 否 纯标准库,无外部依赖;Plane API凭证仅发往配置的目标Plane Host

文件构成

18 个文件 · 5202 行
Python 12 个文件 · 4798 行Markdown 5 个文件 · 383 行Other 1 个文件 · 21 行
需关注文件 · 5
scripts/plane_create_entity.py Python · 741 行
未声明的K3s/Django Shell fallback实现任意Python代码执行 · K3s fallback可通过SSH跳板绕过kubeconfig路径 · K3s fallback使用base64编码绕过静态分析
scripts/test_plane_sync.py Python · 513 行
https://plane.example.com/myworkspace/projects/ · https://plane.example.com · http://plane.example.com · https://evil.example
scripts/intake.py Python · 327 行
未声明的Windows注册表API密钥访问 · 硬编码Windows用户路径 · https://plane.dgs.ai.kr/api/v1/workspaces/dgs
scripts/plane_client.py Python · 323 行
跨skill隐式依赖workspace_profile模块
scripts/test_plane_priority_mapping.py Python · 169 行
https://plane.es6.kr
其他文件 · plane_create_issue.py · plane_sync.py · plane_update_entity.py · plane_bulk_update.py · prune_p2p3.py · plane_indexify.py +1

安全亮点

核心Plane REST API操作有完善的HTTPS校验和重定向保护(_NoRedirect处理器防凭证泄漏)
Plane API token明文凭证不通过重定向传递(add_unredirected_header模式)
非HTTPS Plane Host被明确拒绝,防护CWE-319明文传输
K3s Django Shell脚本参数化使用json.dumps防止注入
K3s命令在kubectl不可用时自动跳过,有fail-safe机制
fix_plan.md写操作使用atomic write(temp file + os.replace)防并发破坏
plane_indexify.py有并发冲突检测(写前验证文件快照)
代码质量高,含详尽Docstring和安全注释(CWE防护说明)
无外部恶意依赖,使用纯标准库
支持dry-run模式,变更前可预览