世界を動かす技術を、日本語で。

少ない方が安全:オブシディアンがサプライチェーン攻撃のリスクを低減する方法

2025年9月20日原文(obsidian.md)

概要

  • Obsidian はサプライチェーン攻撃対策を徹底した設計
  • 依存ライブラリを極力減らし 独自実装 を重視
  • 依存関係は 厳密なバージョン管理 とロックファイルで制御
  • アップグレードは慎重かつ段階的 に実施
  • 多層的な安全対策で 利用者のプライバシーと安全 を確保

Obsidianのサプライチェーン攻撃対策

  • サプライチェーン攻撃は 悪意あるアップデート がオープンソースコードに紛れ込むリスク
  • Obsidian では依存する外部コードを最小限に抑制
    • 同カテゴリの他アプリと比較して 依存数が少ない 特徴
    • 依存ライブラリ一覧は Creditsページ で公開
  • 機能(例:Bases, Canvas)は 市販ライブラリを使わず独自実装
    • 実装の完全なコントロール性確保
  • 小規模ユーティリティは 自前実装 が基本
  • 中規模モジュールは ライセンス許諾範囲でフォークし内包
  • 大規模ライブラリ(例:pdf.js, Mermaid, MathJax)は
    • 既知の安全なバージョンファイル を直接同梱
    • アップグレードは セキュリティ修正時など必要最小限
    • アップグレード時は リリースノート精読・変更差分確認・徹底検証
  • 依存関係のグラフが浅く サブ依存も最小限
    • 攻撃が紛れ込むリスクの低減

実際にアプリに含まれるもの

  • 実際のアプリに含まれるパッケージは Electron, CodeMirror, moment.js などごく一部
  • ビルド時のみ使うパッケージ(例:esbuild, eslint)は ユーザー環境に含まれない

バージョン管理とロックファイル運用

  • 全依存関係は厳密なバージョン指定 とロックファイルで管理
    • ロックファイルがビルド時の 唯一の参照元
    • これにより 再現性のあるインストール変更監査の容易化 を実現
  • postinstallスクリプトは不使用
    • インストール時の 任意コード実行リスクを排除

アップグレード運用方針

  • 依存関係のアップデートは 慎重かつ段階的
    • 変更履歴を逐一確認
    • 新バージョンで追加された サブ依存も精査
    • 変更が大きい場合は 差分比較
    • 自動・手動テスト で主要動作を確認
    • レビュー通過後のみロックファイルを更新
  • 実際のアップデート頻度は 非常に低い
    • 安定稼働を優先し 頻繁な変更を避ける
    • アップデート時は 新規依存追加と同等の慎重さ

時間的バッファの活用

  • リリース前に十分な遅延期間 を設ける運用
    • その間に コミュニティやセキュリティ研究者による検知 が期待できる
    • 問題のあるバージョンは 出荷前に発見されやすい

多層防御によるリスク低減

  • 単一の対策だけでなく
    • 依存数削減
    • 浅い依存グラフ
    • 厳密なバージョン固定
    • postinstall排除
    • 慎重なアップグレード
  • これらの多層的アプローチで サプライチェーン攻撃のリスクを大幅に低減
  • コードがユーザーに届く前に問題を発見できる長い猶予期間 を確保

さらなるセキュリティ情報

  • Obsidianの広範なセキュリティ方針や過去の監査 については
    • 公式 Securityページ監査報告書 を参照

Hackerたちの意見

他のアプリを使ってメモや共有をしてるから、これを読むのはいいし、考える価値があるね。でも、ObsidianってElectronアプリじゃなかったっけ?Electronってリソースをめっちゃ使うイメージがあるし、ネイティブじゃないよね。JavaScriptって「安全」って感じがしないんだけど、俺が時代遅れなのかな?

JavaScriptはかなり安全な言語だよ。ブラウザは世界規模で安全なJavaScriptを実行するのに大成功してるし、使ってるウェブサイトは全部JavaScriptを動かしてて、他のサイトのデータを読み取れないんだ。Electronも同じで、v8を使ってJavaScriptをサンドボックス化してる。ユーザー入力をそのサンドボックス内で実行しない限り(多くのプログラミング言語が許可してることだけど、JSも含めて)、かなり安全だよ。サプライチェーン攻撃の問題はnpmに特有のもので、JSとは関係ない。npmは最近の攻撃に対してもっと責任を持つべきで、依存関係を公開する際にもっと厳しいセキュリティ管理を強制する必要があるね。

JavaScriptは、おそらく地球上で最も使われている言語の一つだよ。ほとんどのコンピュータや基本的に全てのスマホで動いてるし、これによって多くのセキュリティ問題が発見されることになる。なんで「ネイティブ」アプリがもっと安全だと思うの?

Electronがあんまり好きじゃないけど(Tauriに感謝)、Obsidianは素晴らしいアプリだから、Electronで敬遠する必要はないよ。MCPを接続して、エージェントが個人の知識ベースとして使うこともできるし、かなり便利だよ。

リソースをかなり使うんだよね。PCでは問題ないけど、何千ものノートが入ったObsidianのボールトは、モバイルだとプラグインを無効にしても起動が遅くなることがある。ユーザーはクイックキャプチャプラグインやアプリでこの問題を回避するけど、もっとシンプルなネイティブ版のObsidianがあればいいのに。

いや、実際にはそんなに問題じゃないよ。GitHubやVS CodeもElectronアプリだし、SlackやDiscordもそう。Postmanもそうだよね。ちょっと聞きたいんだけど…マークダウンのノートアプリで何をしてるの?パフォーマンスが問題になる理由は何?もしかして、ThinkPad 701CのLynxセッションでこれを読んでるの?

HTMLをレンダリングする必要があるなら、結局マークダウンはそうなるから、ウェブブラウザを使った方がいいかもね。

JavaScriptはC++よりもずっと安全だよ。だって、メモリ管理された言語だからね。

そうだよ、ユーザーに送るコードには責任があるからね。依存関係を固定しないのはトラブルを招くことになるよ。まさに「インターネットからランダムなコードをダウンロードして、うまくいくことを願う」って感じ。

固定した依存関係も、結局はその依存関係がさらに依存関係を持ってるから、常にランダムなコードをダウンロードしてることになるよ。いや、ほんと、Electronと一緒にどれだけのコードがついてくるか考えると…

依存関係を固定するってことは、固定したバージョン以降に出たセキュリティ修正を逃すことにもなるから、それもトラブルを招くことになるよ。だから、これらの修正に気づくためのメカニズムが必要で、修正をバックポートするか、それを含むバージョンにアップグレードする必要があるね。

これは一つの見方だけど、ほとんどのユーザーがサードパーティのコミュニティプラグインを使ってるってことを無視してるね。Obsidianのプラグインはセキュリティモデルが本当にひどい。自分で作ってみて気づいたけど、Obsidianのプラグインはボールト内の全てのファイルに完全にアクセスできちゃうんだ。Obsidianはもっと「バッテリー内蔵」にする選択肢もあったはずだけど、開発の手間がかかるからコミュニティに任せてる。これが攻撃面を大幅に増やしてるんだよね。プラグインが使う全ての権限を宣言するブラウザ拡張機能を持って、許可されてない権限にアクセスしようとしたらブロックされるようにすることもできたはず。どちらのアプローチも「サードパーティの依存関係が少ない」よりも、エンドユーザーにとってもっと実際的なセキュリティを提供できたはずだよ。

Hacker Newsで議論の続きを見る