Deno のセキュリティモデルを好まない(2024)

2026/11/08 23:42

Deno のセキュリティモデルを好まない(2024)

RSS: https://news.ycombinator.com/rss

要約▶

Japanese Translation:

2024 年 8 月 31 日 に公開された本記事は、Deno のセキュリティモデルが、サンドボックスを模倣するに過ぎるパーミッションシステムに依存しているため、本質的に欠陥があり誤導的であると主張しています。「デフォルトで安全(secure by default)」としてマーケティングされ、

--allow-read
や
--allow-run
などのフラグが存在するにもかかわらず、ランタイムは stdin/stdout を介してターミナルプロンプトを攻撃者によって操作できるようにし、
PATH
および
LD_PRELOAD
のように制限のない環境変数へのアクセスを許可し、動的リンカーのトリックを用いてサンドボックスから脱出することを可能にしています。最近のパッチですら、セキュリティ判断のために攻撃者制御のチャンネルを使用するという核心にあるアーキテクチャ上の問題を解決できていません。著者は、「巧妙ではない悪意のあるコードに対する保護」という概念が、信頼できないコードに対して危険な虚偽の安全感を与えるものだと批判しています。したがって、本稿は内部のサンドボックス化を捨てて
bwrap
(バブルワップ)を採用することを推奨し、真のプロセス隔離を実現するとともに、適切な外部サンドボックス化なしで特権プロセス内で信頼できないコードを実行することは、特定のパーミッションの組み合わせに関わらず深刻なリスクであると警告しています。

本文

Deno のパーミッションシステム:本質的脆弱性と誤解のリスクについて

2024 年 8 月 31 日に公開された記事において、著者は Deno のパーミッション(権限)システムがセキュリティ的に根本的な弱点を含み、誤解を招くアプローチであると指摘しています。以下に論点と推奨事項を整理します。

Deno とパーミッションの仕組み

Deno の概要

  • JavaScript 用のランタイム環境です。
  • 標準ライブラリ、パッケージマネージャー、TypeScript トランスパイラなどの機能を統合していますが、JavaScript を直接コンパイルするのではなく V8 ランタイムを再利用しています。
  • 象徴的な機能である「デフォルトで安全」を実現するために、パーミッションシステムを採用しています。

パーミッションの基本概念

Deno で外部世界へのアクセス(ファイル読み取りやコマンド実行など)を行うには、明示的に許可が必要です。

  • 起動時の指定: コマンドライン引数でアクセス範囲を制限できます。
    # 例:/tmp/dir からのみ読み込み、特定の コマンドのみ実行可能
    deno run --allow-read=/tmp/dir --allow-run=uname code.ts
    
  • 実行時のリクエスト: プログラム内で
    Deno.permissions.request()
    を呼び出すと、ターミナル上にプロンプトが表示されます。

プロンプト表示例

以下のコードを実行すると、ユーザーに承認を求めるウィンドウ(ターミナル上)が現れます。

const r = { name: "read", path: "/tmp/dir" } as const;
await Deno.permissions.request(r);

ターミナル上の表示:

┌ ⚠️  Deno requests read access to "/tmp/dir".
├ Requested by `Deno.permissions.request()` API.
├ Run again with --allow-read to bypass this prompt.
└ Allow? [y/n/A] (y = yes, allow; n = deny; A = allow all read permissions) > 

問題点の分析

1. プロンプト表示手法の脆弱性

ターミナル上での許可プロンプトは、GUI ウィンドウのような安全なインターフェースではなく、標準出力(stdout)と標準入力(stdin)のみを利用しています。

  • バンド内(in-band)通信の問題:
    • 通常、コマンドは stdout に情報を送り込みます。ターミナルはそれを表示しますが、シェルがこれを理由に別のコマンドを実行することは稀です。
    • しかし、Deno は悪意のあるコードが stdout や stdin を恣意的に操作することを許容します。
  • 攻撃シナリオ:
    • 攻撃者がターミナルの色を変更してプロンプトを隠したり、ユーザーの入力を誘導・操作したりできます。
    • **「Enter キーを押して続行」**などの表示は標準的ですが、実際の許可メカニズムに対する欺瞞(トリック)となり得ます。
  • 根本的な欠陥:
    • 攻撃者が制御するチャネル(ターミナル)を通じて「セキュリティに敏感な情報」を受け取ることは危険です。ウェブページでパスワード入力画面を表示し、実際には別のドメインにデータを送信するようなリスクと同じです。
    • 非標準的なターミナル機能との相互作用も予測不可能であり、追加のリスクになります。

補足:

sudo
との違いは、
sudo
がパスワード入力を要求する前に他のコードを実行しない点にあります。ターミナルの状態を操作して
sudo
を騙すのは、ターミナル自体が脆弱であることを意味します。

2.
--allow-run
の不徹底な実装

コマンド指定の簡略化(例:

--allow-run=uname
)はセキュリティ上致命的な弱点です。

  • 問題の本質:

    • uname
      という文字列は、フルパスではなく PATH に設定されたディレクトリを順番に検索して見つけたものです。
    • プログラムが一意の名前で識別されることを前提としておりません。
  • 攻撃例 1:PATH 操作による実行: 環境変数

    PATH
    を変更するだけで、意図したコマンドではなく、悪意のあるスクリプトが起動します。

    $ cat t.ts
    // Deno コードで uname を呼び出す
    const command = new Deno.Command("uname", { ... });
    
    $ # 実際のシステム上の uname に触るのではなく
    $ echo '#!/bin/sh' > /tmp/tmp.7ofmKaNW83/uname
    $ echo 'printf "lol"' >> /tmp/tmp.7ofmKaNW83/uname
    $ chmod +x /tmp/tmp.7ofmKaNW83/uname
    
    $ deno run --allow-run=uname t.ts
    lol
    
  • 攻撃例 2:LD_PRELOAD を介したサンドボックス脱出: 動的にリンクされた実行ファイル(大部分の実行ファイル)は、環境変数で構成可能です。

    LD_PRELOAD
    を指定することで、任意のコードを実行できます。

    // C コード:t.c
    #include <stdio.h>
    
    __attribute__((constructor)) void lol() {
        puts("lol");
    }
    
    // TypeScript コード
    const command = new Deno.Command("uname", {
      env: { 
          'PATH': '/tmp/tmp.7ofmKaNW83',
          'LD_PRELOAD': '/tmp/tmp.7ofmKaNW83/liblol.so'  // サンドボックス脱出
      },
    });
    
  • 開発者の見解: Deno の開発者は、「頭が良すぎない悪意のあるコード」を防ぐことが目的であると述べましたが、これは実質的に「環境設定やコマンドの特定パッチを修正すれば安全」という誤った安心感を与えるものです。

    • git-over-SSH
      のような特定のユースケースでは有効ですが、一般用途のサンドボックス化には不十分です。
    • ユーザーは
      $EDITOR
      を指定するだけで、そのエディタが
      VIMINIT='!rm -rf /*'
      を設定されれば全データが消えるリスクを認識していない可能性があります。

結論と推奨事項

Deno の現状評価

  • 擬似的なサンドボックス: Deno は標準ライブラリのフィルタリングでシステムコールの制限を模倣していますが、プロセス自体はサンドボックス化されていません。
  • 危険性:
    • 「権限なし」で実行しているつもりでも、環境変数やシンボリックリンク、動的ライブラリ経由で脱出可能であるため、「権限なし」という状態は幻想です。
    • ユーザーに複雑なパーミッションの組み合わせを理解させることを暗黙に要求しており、誤運用を招きます。

安全な利用条件(限界)

Deno を完全に安全にするのは不可能ですが、以下の制約を厳格に守ることでリスクを減らせます:

  1. 危険な権限の完全排除:
    • --allow-run
      のようなコマンド実行権限は一切使用しない。
  2. 環境変数の管理:
    • 環境変数を設定せず、特に
      --allow-env
      も避ける(メモリエラーや libc 関数の影響リスクがあるため)。
  3. プロンプトの無効化:
    • ターミナルを欺かれることを防ぐため、できれば
      --no-prompt
      を使用。
  4. シンボリックリンクの注意:
    • --allow-{read,write}
      を指定したディレクトリ内のシンボリックリンクに細心の注意を払う。
  5. リソース枯渇への対応:
    • CPU やメモリの制限はパーミッションでは制御できないため、別途管理する必要がある。

著者の推奨結論: 「適切なサンドボックス」を使用すべきであり、Deno のセキュリティモデルを支持しない立場です。非対話的なコンテキストでリソース消費のみを制御したい場合でも、「権限なし」という状態を信頼するのは罠です。標準ライブラリの API 組み合わせによる脱出経路が存在することを無視するべきではありません。

推奨代替案

  • 信頼できないコードを実行する場合、
    bwrap
    (bubblewrap)
    を使用してください。
    • 真にサンドボックス化された環境を提供します。
    • システムコールレベルでの制限が可能で、環境変数や動的リンクのリスクも軽減できます。

開発者へのメッセージ

  • 技術的な意見の不一致は起こり得ますが、いじめを通じて解決された技術的問題は存在しません。
  • Deno の開発者に批判的な投稿を繰り返すのは、誰も助けられないため控えてください。

同じ日のほかのニュース

一覧に戻る →

2026/11/09 4:08

Dux:ファイルマネージャーとテーマ機能を備えた、無料のオープンソース Wayland デスクトップシェル

## Japanese Translation: DMS 2.1 の最新リリース(コードネーム「Stormborn」)は、無料のオープンソースデスクトップ環境に大規模なアップグレードをもたらします。その統一されたビジュアル体験と強力な新機能により、アップデートの中心には Dux Modular Shell という動的デスクトップインターフェースがあります。このシェルはスムーズなアニメーション、ライトモードとダークモード間のシームレスな切り替え、および対応する GTK、GTK4 および Qt アプリケーション向けの一致した色の自動生成をサポートします。このバージョンでは高度なユーティリティも統合されており、其中包括 Dux Files — タブ、分割ビュー、検索、ゴミ箱、デバイス、ネットワーク共有を備えた高速でキーボードファーストのファイルマネージャー — と Dux GOP です。Dux GOP は CPU、メモリ、GPU、ディスク、ネットワークインターフェースなどのシステムメトリクスに対するステートレスなモニタリングを提供します。追加機能にはビデオウォールペーパー、改修されたメディアプレーヤー、インターフェースの密度調整、そしてライトおよびダークテーマの両方でターミナルの色とシンタックスハイライトを最適化する専門的な「dank16」アルゴリズムが含まれます。リリースでは、美しくデザインされたログイン体験を提供する Dux Greeter、超高速ファイルシステム検索ツールである Dux Search、Google、Microsoft、CalDAV、iCloud プロトコルを深く統合したクラウド連携機能を備えた Dux Calendar も導入されます。目立つ機能として、すべてのアプリケーションに単一のテーマを適用でき、手動設定なしで一貫した美的体験を実現できる点が挙げられます。「支払額自由」モデルを採用しており、開発インフラストラクチャの資金調達のために自主的なチップに依存しながらも、誰もがアクセスできるようにしています。高性能とモダンなデザインの組み合わせにより、DMS 2.1 はアクティブなコントリビューターコミュニティによって完全に牽引される統合的で高効率なデジタルワークスペースをユーザーに提供します。

2026/11/05 2:05

宣言的ドラッグ&ドロップ

## Japanese Translation: 元の要約は内容が充実していますが、Key Points List(特に引用および具体的なデモ例)に含まれる詳細な情報が不足しているため、完全性を保ちながら文の流れを維持しつつこれらの情報を統合した改良版を提示します。 以下に、主要な点をすべて取り入れた**改良された要約**を示します。 > Horowitz, Blinn, および Heer による論文「Declarative Dragging」は、UIST 2026 で最優秀論文賞を受賞しました。Andrew Horowitz が 2022 年に発表した数学を実感化するためのゲームプロトタイプに着想を得たこの研究は、2023 年シアトルで行われた著者間の議論を経て発展しました。本システムでは、「Declarative Dragging」(D2)というモデル駆動型アプローチによりドラッグアンドドロップのインタラクションを再定義しており、幾何学を手動で計算するのではなく未来の状態を定義します。**Dragology**ライブラリを SVG インターフェースの実装に用いた D2 は、**speculative rendering** を採用してインタラクションを瞬時にプレビューし、重労働なく滑らかなアニメーションを合成します。このフレームワークは非常に組み合わせやすく、スナップやフローティング、トランジションといったモディファイアを組み合わせて単純な動作と統合することができます。本アプローチは、代数やねじれた木、ベジェ曲線、編み目、カードの山、顔(face)、トロミノ、芽生える木などの教育用デモを含む幅広いアプリケーションを可能にします。注目すべき学術的な拡張には、並列データを同時に操作する**「Permutation lab」**と、宣言的なドラッグによってコードのリファクタリングを実感化・発見可能にする**「Hazel」**環境があります。今後の取り組みとしては、ゲームパッド制御への適応や、元の数学ゲームを 2D スクリーンから完全に機能する 3D ワールドへと移行することが挙げられます。

2026/11/09 3:16

ゴールドマンサックスが銀行家やトレーダーからClaude Codeの使用を取り下げる

ゴールドマン・サックスは、エンジニアに対し、Anthropic の Claude などのサードパーティ製の自律型 AI コーディングエージェントを用いて生産環境向けのソフトウェアを開発することを大幅に制限し、実質的にトレーダーや銀行家らが市場モデルや顧客分析のためにそれらを使用するのを禁じています。同社は全従業員向けに内部の AI アシスタントを維持しており、公式なエンジニアリング監査が欠落する外部エージェントの使用を停止しましたが、これは以前「vibe coding」として非エンジニアが最小限の監督下でツールを開発することを推奨していたガイダンスからの変更です。この方針転換は、検証されないコードがテストおよびレビュー統制を回避すること、顧客データに関する情報障壁違反、およびトークン単位で課金される生産性コスト(Accenture が現在は従業員 1 人当たり月々 29 ドルを負担して Claude を導入)への懸念に由来します。これはゴールドマンが以前トレーダー向けに同様のツールを推進したにもかかわらず、Anthropic のエンジニアと協力してバックオフィスのワークフロー向けのエージェントを開発していたことからの顕著な変化を示しています。この制限措置にもかかわらず、ゴールドマンは Anthropic の upcoming Nasdaq 上場において主要な引受業者として残っています。また、労働力削減を進めつつも Claude Code の大規模導入を計画するバークレイズなどの競合他社との対比も示されています。

Deno のセキュリティモデルを好まない(2024) | そっか~ニュース