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 是一个开源 AI 第二大脑工具把任意来源的资料归档进本地 Obsidian 知识库自动读取、链接并沉淀为可查询的 Markdown 知识图谱。归档入口直接接收外部文件capture.py 因此内置了一整套预检与仲裁逻辑。先做一个推演攻击者把名为../../etc/cron.d/x的文件丢进inbox/最远能走多远答案是第一次词法校验就被拒——..路径段直接触发INVALID_CONFIG_PATH。下文按攻击场景复盘每道关卡试探什么、在哪里判定、失败抛什么错误码。边界声明见 SECURITY.md。⚠️ 落盘前的三道预检路径穿越、文件名与批量预算这组检查全部发生在词法层面不接触磁盘。路径穿越的试探最典型绝对路径、反斜杠、./..段、未规范化写法。_validate_relative_directory逐项拒绝命中即抛INVALID_CONFIG_PATH事务层的_normalize_vault_path标准更严覆盖所有写入路径。文件名卫生由_validate_filename一次完成统一以UNSAFE_FILENAME拒绝控制字符与格式字符含零宽、换行首尾空格、以点或空格结尾Windows 保留名CON、COM1、NUL非 NFC 归一化的 Unicode 名称该函数还强制 NFC 归一化与240 字节长度上限。这类名字多用于伪造目录层级或绕过前缀判断进盘前统一拦掉。资源炸弹走数量与体积两条路单批100 个文件、单文件64 MB、整批256 MB、捕获队列文档8 MB / 4096 条capture.py。CaptureBudget把上限固化为结构dataclass(frozenTrue) class CaptureBudget: max_items: int 100 max_total_bytes: int 256 * 1024 * 1024 max_file_bytes: int 64 * 1024 * 1024这是硬限而非建议值单文件超限抛FILE_BUDGET_EXCEEDED批量超限抛TOTAL_BUDGET_EXCEEDED整批中止。 符号链接为什么必须逐段检查真实文件系统上的仲裁词法上合法的a/b.md其中a仍可能是指向库外目录的符号链接。第二组检查因此落在真实文件系统上。包含性仲裁由assert_within执行先解析符号链接再确认落点仍在库内否则抛PATH_OUTSIDE_VAULT。归档管线对符号链接共设四个检查位命中即终止整批源根目录 →SOURCE_ROOT_SYMLINKinbox 任意条目 →SOURCE_SYMLINK.raw内容寻址库 →RAW_STORE_SYMLINK事务写入路径每一段 →SYMLINK_WRITE_PATH分别落在 capture.py 与 transaction.py。_allowed_source_path还做逐段扫描从收件箱根逐级拼路径任一中间目录是符号链接即抛SOURCE_SYMLINK若文件是穿过外部别名才进入 inbox则抛SOURCE_OUTSIDE_INBOX——源文件本身干净也没用。跨平台别名更隐蔽在不区分大小写的文件系统上Note.md与NOTE.MD是同一文件可被用来混淆权限判断。_assert_no_existing_portable_alias枚举目录兄弟项NFC casefold 后冲突即抛CASEFOLD_PATH_ALIAS从命名层面消除歧义。⏱ 时间差与多进程竞态下内容寻址与锁令牌如何兜底第三组攻击利用检查与落盘之间的时间差以及多进程同时写同一个库。身份指纹source_identity计算 SHA-256 的同时比对读取前后的 inode、大小与修改时间文件在计算期间被偷换立即抛SOURCE_CHANGED。归档的永远是你看到的那份字节。重复归档时_find_existing_capture发现同摘要旧副本会重新校验字节名字对但内容不对说明仓库被外部改写抛IMMUTABLE_SOURCE_CONFLICT。原始资料区由此保持只创建、永不修改。多进程竞态由目录型锁CaptureQueueLockcapture.py处理锁目录原子创建失败即已有持有者持有者写入 pid、主机名与随机 token释放前回读验证 token被偷换则抛QUEUE_LOCK_OWNERSHIP_LOST。死锁恢复同样保守仅当持有进程确认已死且锁超龄才清理。事务层transaction.py以预检哈希 持久日志 原子替换兜底每个写入记录预期哈希回滚时逐字节验证目标未被换过否则抛ROLLBACK_TARGET_CHANGEDtransaction.py。并发冲突统一归入CaptureConflict家族capture.py不静默失败。外部 URL 入口私有主机与重定向如何被拒URL 适配器是最典型的 SSRF 面。判定先于函数localhost、169.254.*、.internal等私有或本地主机一律先抛URL_PRIVATE_HOST逻辑在_validate_public_host。validate_https_url只接受 HTTPS非 https 直接URL_SCHEME_FORBIDDENURL 含空白、控制字符或反斜杠则URL_INVALID。重定向链由validate_redirect_chain逐跳核对白名单任一跳出域名不在源域名 显式批准列表内即整链拒绝。外部动作默认只生成惰性计划用户明确同意才执行——该不变量同样写在 SECURITY.md。动手验证只需两步git clone https://gitcode.com/GitHub_Trending/cl/claude-obsidian后按 docs/install-guide.md 初始化一个独立知识库再把恶意命名的文件丢进inbox/观察抛出的错误码即可。攻击手法 × 检查位置 × 错误码总表攻击手法检查位置错误码路径穿越..、绝对路径、反斜杠_validate_relative_directoryINVALID_CONFIG_PATH符号链接越出库边界assert_withinPATH_OUTSIDE_VAULT源根目录本身是符号链接配置根检查SOURCE_ROOT_SYMLINKinbox 内符号链接条目discover_files遍历SOURCE_SYMLINK穿过外部别名进入收件箱_allowed_source_pathSOURCE_OUTSIDE_INBOX.raw存储或副本为符号链接_planned_destinationRAW_STORE_SYMLINK文件名注入控制字符、保留名、超长_validate_filenameUNSAFE_FILENAME大小写/重音别名混淆_assert_no_existing_portable_aliasCASEFOLD_PATH_ALIAS单文件/批量体积炸弹CaptureBudgetFILE_BUDGET_EXCEEDED/TOTAL_BUDGET_EXCEEDED指纹计算期间偷换源文件source_identitySOURCE_CHANGED篡改已有内容寻址副本_find_existing_captureIMMUTABLE_SOURCE_CONFLICT并发偷换队列锁所有权CaptureQueueLockQUEUE_LOCK_OWNERSHIP_LOST回滚时目标已被替换事务回滚校验ROLLBACK_TARGET_CHANGED私有/本地/内网 URLSSRF_validate_public_hostURL_PRIVATE_HOST非 HTTPS 源validate_https_urlURL_SCHEME_FORBIDDEN重定向跳出白名单validate_redirect_chain整链拒绝关键文件速查文件职责capture.py词法与文件名预检、预算、队列锁、URL 校验transaction.py写入路径仲裁、符号链接段检查、别名检测、回滚paths.py库根选择与符号链接解析后的包含性检查SECURITY.md安全边界与防御性不变量声明docs/install-guide.md安装与知识库初始化【免费下载链接】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),仅供参考