ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

claude-obsidian 如何拦截恶意文件?归档安全防御全链路一次看懂

claude-obsidian 如何拦截恶意文件?归档安全防御全链路一次看懂 claude-obsidian 如何拦截恶意文件归档安全防御全链路一次看懂【免费下载链接】claude-obsidianSelf-organizing AI second brain for Obsidian Claude Code. Drop any source and Claude reads, links, and files it into one connected knowledge graph of plain Markdown you own. AI note-taking, personal knowledge management (PKM), and an open-source Notion alternative. Based on Karpathys LLM Wiki pattern.项目地址: https://gitcode.com/GitHub_Trending/cl/claude-obsidianclaude-obsidian 把丢进 inbox 的任意资料自动读解、链接并归档为互连的 Markdown 知识图谱。本文从归档入口出发拆解它的归档安全防线符号链接拒绝、路径包含性、预算硬限、内容寻址与并发回滚。 收件箱是裸奔的入口威胁从哪里来这套工具的核心理念是你拥有自己的文件知识库就是一个普通目录没有云锁没有沙箱。SECURITY.md 也直言它运行在用户自身的文件权限之内不是隔离环境。这意味着归档入口capture天然要生吞外部文件而威胁恰好集中在这里路径型../../etc/passwd这样的穿越写法、绝对路径、藏在目录中间的符号链接都试图把读写引出库外文件名型带控制字符、换行或零宽字符的名字能欺骗列表显示CON.md这类保留名在 Windows 上直接失灵竞态型文件在你算哈希的瞬间被替换、两个进程同时写队列、写了一半进程被杀资源型一个 70MB 的巨型文件或一万个小文件构成的文件炸弹。因此它选择失败即拒绝每一个可疑输入都对应一个确定性的错误码而不是静默降级。下面按先静态后动态的顺序看它怎么防。 入口静态盘问文件还没碰磁盘就要过四道关文件名卫生检查先拦控制字符与保留名想象一个名为报告.md\n.md的文件出现在归档清单里——换行让它看起来像两个文件。_validate_filename一次把这类问题全查了非 NFC 归一化、首尾空格、以点或空格结尾、任何控制/格式字符以及CON、COM1、NUL等 Windows 保留名统统不进门。文件名超过 240 字节也不行。失败即抛UNSAFE_FILENAME该文件被丢弃其余合法文件不受影响。路径词法规则..和反斜杠不许进门配置里的相对目录由_validate_relative_directory把守绝对路径、\、./..段、以及a/../b这种未规范化的写法都会被拒INVALID_CONFIG_PATH。事务层的_normalize_vault_path更严控制字符、NFC 归一化、1024 字节长度上限逐项检查不合格报INVALID_WRITE_PATH或NONCANONICAL_WRITE_PATH。预算硬限大文件与文件炸弹在登记处就被拒CaptureBudget是先量尺寸再放行单批 100 个文件封顶单文件 64MB、整批 256MB捕获队列文档限 8MB / 4096 条。这些数字不是建议值超限直接抛FILE_BUDGET_EXCEEDED、TOTAL_BUDGET_EXCEEDED并中止整批磁盘上一个字节都不会多写。外链准入只认 HTTPS私有网段一律拒网络抓取是最容易越权的口子。validate_https_url只接受 HTTPS 方案localhost、.local、.internal、.lan等单标签私有主机全部拒绝数字或十六进制拼写的 IP如0x7f.0.0.1也识别为伪装地址重定向链由validate_redirect_chain限定在原始域名与白名单内。外部动作只能生成execute: false的惰性计划必须用户显式同意才执行。违例返回URL_PRIVATE_HOST、URL_SCHEME_FORBIDDEN或REDIRECT_HOST_FORBIDDEN。 路径实名核验词法干净不等于位置安全符号链接逐段拒绝路过的每一个别名都不行词法上合法的a/b.md中间的a完全可能是一个指向/etc的软链。所以它沿路径逐段点名源根目录是链接 →SOURCE_ROOT_SYMLINKinbox 内任何目录或文件条目是链接 →SOURCE_SYMLINK.raw内容寻址存储是链接 →RAW_STORE_SYMLINK事务写入路径的每一段是链接或 Windows junction →SYMLINK_WRITE_PATH。只要文件穿过了一个别名目录进收件箱还会被SOURCE_OUTSIDE_INBOX拦下。双重包含性校验解析符号链接后再问一遍你还在库内吗assert_within先把候选路径resolve掉符号链接再确认最终落点仍在库根之下不在就抛PATH_OUTSIDE_VAULT。事务层的_safe_vault_path在写入前对每个父目录再做一次 lstat 复检把检查过和真正打开之间可能被换掉的窗口堵死。大小写与重音别名审计Note.md和NOTE.MD是同一个坑在大小写不敏感的文件系统上两者会指向同一文件攻击者可用它混淆权限判断。_assert_no_existing_portable_alias会枚举目标目录的兄弟项发现任何做 NFC casefold 后与目标同名但拼写不同的文件即抛CASEFOLD_PATH_ALIAS——宁可这次不写也不留两个看似不同的别名。 内容不可变归档的必须是你看到的那一份SHA-256 身份指纹哈希前后各摸一次脉搏source_identity在逐块计算 SHA-256 的同时比对读取前后的 inode、大小与 mtime打开文件时带O_NOFOLLOW末段若是符号链接也进不来。如果文件在计算过程中被换掉抛SOURCE_CHANGED冲突本文件作废——你归档的永远是你看到的那份内容。重复归档再校验内容寻址文件必须名实相符源文件会被复制成SHA-256 摘要.扩展名存进.raw/captured/。_find_existing_capture发现同摘要的旧副本时会重新逐字节哈希一旦名字对、内容不对说明不可变仓库被外部改写过抛IMMUTABLE_SOURCE_CONFLICT整个操作失败。原始区因此是只创建、永不修改的。 并发冲突兜底多只手抢同一个库时怎么办目录型队列锁加所有权令牌锁不能偷、不能冒充、不能赖CaptureQueueLock靠原子mkdir抢占锁目录抢不到说明已有持有者持有者在owner.json里登记 pid、主机名与随机 token释放前会回读验证 token防止锁被并发偷换。死锁恢复也很保守只有确认同主机持有进程已死且锁超龄才清理清理动作本身还要复查锁身份没变。任何一步对不上抛QUEUE_LOCK_TIMEOUT或QUEUE_LOCK_OWNERSHIP_LOST。预检哈希加持久日志加确定性回滚写一半也不怕事务层给每个写入记录预期哈希落盘用 fsync 加原子替换全过程写进持久日志。回滚时会再逐字节验证目标文件没被人换过否则抛ROLLBACK_TARGET_CHANGED日志本身损坏则报CORRUPT_JOURNAL。所有竞态都归入CaptureConflict错误家族退出码 75中断后可凭日志安全恢复从不静默失败。 上手验证一条 plan 命令看清防御在生效先克隆仓库git clone https://gitcode.com/GitHub_Trending/cl/claude-obsidian按 docs/install-guide.md 初始化一个知识库然后跑python3 scripts/claude-obsidian.py capture plan --vault vault这条命令只读输出每个文件的归档计划形如{ source_identity: a1b2…, source: inbox/sample.md, stored_path: .raw/captured/a1b2….md, would_change: true }把某个 inbox 文件替换成符号链接再跑一次计划会直接以SOURCE_SYMLINK失败确认无误后用capture apply --operation-id ...真正落盘。归档完成的笔记随后会在 Obsidian 中长成图谱归档后的知识结构在画布视图里同样可见 机制、错误码与位置速查防御机制失败时的错误码实现位置文件名卫生控制字符/保留名/长度UNSAFE_FILENAMEclaude_obsidian/capture.py路径词法与规范化INVALID_WRITE_PATH/NONCANONICAL_WRITE_PATHclaude_obsidian/transaction.py符号链接逐段拒绝SOURCE_SYMLINK/RAW_STORE_SYMLINK/SYMLINK_WRITE_PATHclaude_obsidian/capture.py claude_obsidian/transaction.py路径包含性校验PATH_OUTSIDE_VAULT/SOURCE_OUTSIDE_INBOXclaude_obsidian/paths.py claude_obsidian/capture.py大小写/重音别名审计CASEFOLD_PATH_ALIASclaude_obsidian/transaction.py批次与文件预算FILE_BUDGET_EXCEEDED/TOTAL_BUDGET_EXCEEDEDclaude_obsidian/capture.py源文件身份指纹SOURCE_CHANGEDclaude_obsidian/capture.py重复归档再校验IMMUTABLE_SOURCE_CONFLICTclaude_obsidian/capture.py队列锁与所有权令牌QUEUE_LOCK_TIMEOUT/QUEUE_LOCK_OWNERSHIP_LOSTclaude_obsidian/capture.py事务回滚校验ROLLBACK_TARGET_CHANGED/CORRUPT_JOURNALclaude_obsidian/transaction.pyURL 与重定向准入URL_PRIVATE_HOST/REDIRECT_HOST_FORBIDDENclaude_obsidian/capture.py从文件名卫生到符号链接逐段拒绝从内容寻址指纹到锁令牌与确定性回滚——这条归档安全链路保证只要错误码亮起来脏文件就永远走不进你的知识库。【免费下载链接】claude-obsidianSelf-organizing AI second brain for Obsidian Claude Code. Drop any source and Claude reads, links, and files it into one connected knowledge graph of plain Markdown you own. AI note-taking, personal knowledge management (PKM), and an open-source Notion alternative. Based on Karpathys LLM Wiki pattern.项目地址: https://gitcode.com/GitHub_Trending/cl/claude-obsidian创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表