Skill Trust Decision

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密钥。

Install decision first Source: ClawHub Scanned: 22 days ago
Files 18
Artifacts 13
Violations 3
Findings 7
Most direct threat evidence
High RCE
未声明的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

Why this conclusion was reached

2/4 dimensions flagged
Block
Declared vs actual capability

3 undeclared or violating capabilities were inferred.

Review
Hidden execution and egress

13 lower-risk artifacts were extracted and still need context.

Block
Attack chain and severe findings

The report includes 0 attack-chain steps and 3 severe findings.

Pass
Dependencies and supply chain hygiene

Dependencies are present but no obvious high-risk issue stands out.

What drove the risk score up

未声明的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\...硬编码路径,虽为合法默认值但不宜硬编码用户名

Most important evidence

High RCE

未声明的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隔离)
High Credential Theft

未声明的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凭据访问能力
High Priv Escalation

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验证)
Medium Doc Mismatch

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相关能力
Medium Obfuscation

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

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

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

跨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的安全态势
Low Sensitive Access

硬编码Windows用户路径

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

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

Declared capability vs actual capability

Filesystem Pass
Declared WRITE
→
Inferred WRITE
SKILL.md声明Edit/Write,代码读写fix_plan.md/checklist.md
Network Block
Declared READ
→
Inferred WRITE
plane_create_issue.py:通过Plane REST API POST创建issue,属WRITE级别
Shell Block
Declared NONE
→
Inferred WRITE
plane_create_entity.py:397-401 kubectl exec执行Django Shell; plane_update_entity.py类似
Environment Block
Declared NONE
→
Inferred READ
intake.py:23 os.environ.get('DGS_PLANE_API_KEY'); plane_bulk_update.py相同模式
Skill Invoke Pass
Declared READ
→
Inferred READ
SKILL.md声明depends-on fix-plan/todowrite/github-flow,实际通过sys.path跨目录导入共享模块

Suspicious artifacts and egress

Medium External URL
https://keepachangelog.com/en/1.0.0/

CHANGELOG.md:5

Medium External URL
https://semver.org/spec/v2.0.0.html

CHANGELOG.md:6

Medium External URL
https://plane.es6.kr/es6kr/projects/

comment.md:47

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

create.md:80

Medium External URL
https://plane.dgs.ai.kr/dgs/projects/

create.md:93

Medium External URL
https://plane.dgs.ai.kr/dgs/browse/

create.md:93

Medium External URL
https://plane.dgs.ai.kr/dgs/browse/INFRA-77

create.md:94

Medium External URL
https://plane.dgs.ai.kr/api/v1/workspaces/dgs

scripts/intake.py:21

Medium External URL
https://plane.es6.kr

scripts/test_plane_priority_mapping.py:40

Medium External URL
https://plane.example.com/myworkspace/projects/

scripts/test_plane_sync.py:26

Medium External URL
https://plane.example.com

scripts/test_plane_sync.py:83

Medium External URL
http://plane.example.com

scripts/test_plane_sync.py:461

Dependencies and supply chain

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

File composition

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

Security positives

核心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模式,变更前可预览