/** * BRAIN-PATCH P6 — soul.md 写入 9 项安全红线 * * Refs: * - docs/instructions/BRIEFING-BRAIN-SCRIPT-ORCHESTRATION-PATCH.md §3 * - docs/research/agent-platforms-soul-md-comparison-2026-04-18.md §5.1 * * 攻击向量参考: * - LayerX 2026 — Claude Code CLAUDE.md SQL 注入(用零宽字符隐藏 prompt 注入) * - Pillar Security — Cursor .cursorrules 零宽字符 prompt injection * * 9 项红线: * S1 字符白名单 — 拒零宽字符 / Unicode 双向控制 / 控制字符 * S2 SHA256 hash 校验 — 写入与 verify 必须 hash 一致 * S3 BEGIN/END 边界严格 — 写入前 backup 到 ~/.skillfm/backups// * S4 授权预览 — 由前端展示完整 block 原文(本模块不实现,仅约束 sidecar 必须返回 raw 给前端) * S5 uninstall 指令明文 — 块内最后一行必须含 uninstall hint * S6 写入路径白名单 — 仅 cwd 相对的 .md/.cursorrules/.windsurfrules/.aider.conf.yml * S7 OTA 版本控制 — 块头含 `managed by @skillfm/local v{version}` * S8 授权可撤销 — `skillfm uninstall --clean-soul` 精准移除(由 soul.ts removeSkillfmBlock 实现) * S9 企业 kill-switch — subscription.tier='enterprise' 可一键禁用(由 API admin 实现) * * 本文件实现 S1/S2/S3/S5/S6/S7 的纯函数校验;S4/S8/S9 在 sidecar/前端/API 层。 */ export type SoulSecurityErrorCode = 'SKILLFM.SOUL.INVALID_CHARS' | 'SKILLFM.SOUL.PATH_NOT_ALLOWED' | 'SKILLFM.SOUL.MISSING_BOUNDARY' | 'SKILLFM.SOUL.MISSING_UNINSTALL_HINT' | 'SKILLFM.SOUL.MISSING_VERSION_HEADER' | 'SKILLFM.SOUL.HASH_MISMATCH' | 'SKILLFM.SOUL.BACKUP_FAILED' | 'SKILLFM.SOUL.LEGACY_PATH_READ_ONLY'; export declare class SoulSecurityError extends Error { code: SoulSecurityErrorCode; constructor(code: SoulSecurityErrorCode, message: string); } export declare function validateCharWhitelist(content: string): void; /** 算 block 的 SHA256(前 16 字符,与 store 端 content_hash 校验对齐) */ export declare function computeBlockHash(blockContent: string): string; /** verify 时比对:current vs expected hash */ export declare function assertHashMatches(current: string, expected: string): void; export declare function validateBoundaryMarkers(blockContent: string): void; export interface BackupResult { backup_path: string; ts: string; } /** * 写入前对原文件做完整 backup → ~/.skillfm/backups// * 失败抛 SKILLFM.SOUL.BACKUP_FAILED(中断写入,避免无 backup 改文件)。 * * 不存在的文件不需要 backup(写入 = 创建)。 */ export declare function backupFileBeforeWrite(originalPath: string, originalContent: string): BackupResult; export declare function validateUninstallHint(blockContent: string): void; /** * 路径白名单: * - 必须是 cwd 相对路径,或 user-level(~/.claude/、~/.openclaw/) * - 文件名必须在白名单 * - 禁止 /etc /var /usr 等系统路径 * - 禁止 ../ 上跳 */ export declare function validateTargetPath(filePath: string): void; export declare function validateVersionHeader(blockContent: string): void; export interface PreWriteCheckResult { block_hash: string; /** 如果原文件存在则有 backup;不存在为 null */ backup: BackupResult | null; } /** * 写入前的全面校验:S1 + S5 + S6 + S7(+ 触发 S3 backup) * * - S2 hash 在写入后由 store 调用方持久化 * - S4 在前端层 * - S8 由 removeSkillfmBlock 实现 * - S9 在 API admin 层 */ export declare function preWriteCheck(opts: { block_content: string; target_path: string; /** 现有文件内容(用于 backup);不存在传 null */ existing_content: string | null; }): PreWriteCheckResult; //# sourceMappingURL=soul-security.d.ts.map