依存パッケージは VCS から直接取得する必要があります

2026/07/06 5:44

依存パッケージは VCS から直接取得する必要があります

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

要約

Japanese 翻訳:

著者は、Go を新職で運用してきた十年以上の実践に基づき、Go の依存関係管理が Ruby を上回るのは、主に「パッケージを公開する」というステップを廃止し、代わりに go.mod に指定された URL 経由で VCS(例えば GitHub)から直接コードを取得するためであるとしている。このモデルでは、go.mod が依存関係の仕様書およびロックファイルとして機能し、semver の範囲を示さずに正確なバージョン番号をリスト化している。完全性は、sum.golang.org 上の既知の値とハッシュの照合を行うこと、ならびにリポジトリの改ざんを防ぐためのプロキシの使用によって保証される(left-pad などのインシデントがそれを示している)。Go の依存関係のアウディットはソロ開発者にとって容易であり、git log またはフォージ UI を通じてコミットをレビューし、必要に応じて go.mod を更新することで可能となる。

対照的に、Ruby は rubygems.org から .gem アーカイブをダウンロードし、tar で展開し、diff を用いて変更を追跡する必要があるが、これは個々のコミットの履歴を失わせる。この「パッケージの公開に依存する」欠陥は RubyGems、npm、PyPI など多くのシステムに影響を与え、ソースリポジトリが清浄であっても悪意あるコードの注入を可能にする。xz のexploit や event-stream の疑わしい index.min.js などは、ソースリポジトリへの侵害ではなく、公開されたパッケージ自体を乗っ取ることでこのような脆弱性を具体的に示している。JavaScript ベースの言語は、コンパイルされたリソース、TypeScript で生成されたコード、ミニフィケーションされたファイル、およびバイナリー blobs といった観点から追加のアウディット課題に直面している。

RubyGems がクールドアンスと AI 支援スキャンを導入したにもかかわらず、著者はこれらを Go の堅牢な設計と比較して不透明性に乏しい一時的な修正であると見なしている。Ruby の不足を解消するために、著者は Bundler を変更し、GitHub URL および特定のタグですべての依存関係を指定できるようにすることを提案しており、Gemfile.lock でハッシュを使用することで、「パッケージ公開に依存する」モデルから「直接 VCS に基づく」モデルへとシフトさせるのである。これにより、単一障害点が排除され、サプライチェーンセキュリティが大幅に向上し、開発者がバージョン完全性に対してより大きな制御を持つことができるようになる。

本文

Ruby と Go の依存関係管理:セキュリティと監査の観点からの比較

過去 1 ヶ月、新しい正職で Ruby を開発してきました。ここ 10 年あまり Go を主に開発してきた私にとって、この環境の変化は非常に楽しくありました。以前も Ruby を扱った経験がありましたが、「どちらがより優れている」と断定するのは難しい状況です。

Ruby と Go はほぼすべての点で大きく異なりますが、それぞれの文脈において効率的にタスクを達成できることは共通しています。

Go の依存関係管理とセキュリティ

Go が明確に優れていると感じる側面の一つは、依存関係の管理、特に セキュリティ面にあります。

強固な設計原理

  • 攻撃への耐性: パッケージを「公開する」ステップが存在しないため、悪意のある依存関係に対して格段に強い構造になっています。
  • 特定方法: 依存関係は URL で特定されます(例:
    github.com/user/pkg
    )。
  • フェッチ方法: VCS(ここでは Git)の確認を行い、
    go.mod
    ファイルで指定したタグやコミットからコードを直接フェッチします。
  • 仕様書としての
    go.mod
    :
    • 依存関係の仕様書とロックファイルの役割を兼ねており、厳密なバージョン番号のみが記載されます(例:
      ~>1.1
      のような範囲指定はありません)。
    • 直接依存関係も間接依存関係も含め、完全な依存関係ツリーがこのファイルにリストされます(
      go
      コマンドが自動で書き込みます)。
  • 改ざん防止機構:
    • sum.golang.org
      に登録された既知のハッシュ値とすべてのファイルのハッシュを照合し、タグへの改ざんを防ぎます。
    • リポジトリの内容が意図的に変更されるのを防ぐため、プロキシを経由する構成になっています。

重要: 依存関係は URL によって特定され、コードは VCS から直接フェッチされます。これは直接依存関係と間接依存関係の双方に適用されます。

監査の手顺

依存関係の確認や更新は比較的簡単です。通常以下の手順を行います:

  1. git log -p old..new
    を実行してフォージの Web UI を介し、すべてのコミットを確認する。
  2. 必要に応じて
    go.mod
    ファイルを更新する。
  • 既存の依存関係が大きく変更されることは稀なため、作業は迅速に進みます。
  • 深く細かい検証を行う必要はなく、単に不審な点をチェックすれば十分です。
    • 特に目立つ例:グロービブ処理を行うライブラリの中に
      exec.Command(..)
      http.Post(..)
      が含まれているケース。

不正なコードを隠蔽することは極めて困難であり、このような監査作業は一人の開発者でも何年も続けることが可能です。より大きな依存関係ツリーを持つプロジェクトでは時間がかかりますが、難しくはありません。

Ruby の依存関係管理と課題

一方、Ruby の場合は事情が異なります。「パッケージを公開する」ステップが存在するためです。

  • .gem
    アーカイブを作成し、それを
    rubygems.org
    にアップロードします。
  • このアーカイブの中身を何でも入れられるため、ソースコードのリポジトリの内容と一致しているとは保証されていません。

監査の手顺(Ruby)

監査を行うためには、以下のような手動処理が必要です:

curl -s https://rubygems.org/downloads/example-2.7.5.gem > old.gem
curl -s https://rubygems.org/downloads/example-2.8.2.gem > new.gem
mkdir old new
tar xf old.gem -C old
tar xf new.gem -C new

(cd old && tar xf data.tar.gz)
(cd new && tar xf data.tar.gz)

diff -urN old new

Ruby における問題点

  • 手順が非常に手間がかかります
  • 個々のコミット情報が失われ、監査自体が一般に難しくなってしまいます。
  • 差分が小さい場合のみ問題ありませんが、場合によっては巨大な出力になり、コミット履歴にアクセスできないことが大きな負担となります。
  • 「自分が何を監査し、何を見過ごしたか」が混乱することも十分あり得ます。
  • このため、このような監査を行っている人の数は極めて少ないと考えられます(作業が面倒だから)。

セキュリティ攻撃の本質とその他の課題

サイディンチャネル攻撃の実態

私がこれまで目にしたサイディンチャネル攻撃のほとんどは、「パッケージ公開攻撃」と呼ぶのが正確です。

  • 攻撃は「パッケージを公開する」ステップに何かを注入することで成り立ちます。
  • プラットフォーム(RubyGems, npm, PyPI, FTP など)の違いよりも、アーカイブへの悪意のあるコードの注入という点で本質は同じです。
  • 実際のソースコードリポジトリが侵害されることは稀であり、露見しやすいためです。
  • 効果的な攻撃には、わずかに exploit を隠蔽する必要があるためです。

過去の実例(npm)

最近の

npm
関連の侵害事件はすべて、以下の方法に依存していましたが、ソースコードリポジトリそのものが直接改ざんされたわけではありません:

  • npm
    アカウントへのアクセス権限を取得し、公開されたパッケージ内にコードを注入する方法。
  • 例 1:
    xz
    - ソースコードには悪意のあるコードが含まれていましたが不活性化しており、バイナリ形式のテストファイルに隠されていました。改ざんされたリリース文件中で初めて有効化されました。
  • 例 2: 2018 年の
    event-stream
    -
    flatmap-stream
    に依存し、公開された
    npm
    パッケージ上のみに
    index.min.js
    ファイル内に悪意のあるコードが存在していました。

コンパイル済みリソースの課題

この点で第二の問題が浮かび上がります:コンパイル済みリソースを含むパッケージの問題です。

  • TypeScript が生成する JavaScript コードは完全に読めず、オリジナルと比較しても読みづらく、監査しにくいものです。
  • minified ファイルやバイナリデータのケースも同様です。
  • これは Ruby ではあまり問題にならず、特に
    npm
    において大きな課題となっています。

提言:Go Modules のアプローチへの移行と考察

現状の状況

  • Go Modules に他にもセキュリティ機能がありますが、割愛します。
  • 重要なのは透明性と、「パッケージを公開する」というモデル自体の見直しです。

結論: AI ツールだけではこの問題を解決することはできません。「パッケージを公開する」モデルには不可欠な透明性が欠けています

バッダー(Bundler)での既存の対策

完全に変更することは困難ですが、特定の状況では以下の対応策が存在します:

gem 'rails', git: 'https://github.com/rails/rails.git', tag: 'v8.1.2'
  • これにより Rails gem は Git からフェッチされますが、依存関係は依然として
    rubygems.org
    から取得
    されます。
  • Bundler に Git をすべての依存関係に使用させる方法はあるかもしれませんが、非常に困難で誤って
    rubygems.org
    を使用しやすくなります。

提案する仕組み(Gemfile の変更案)

現存する Gemfile を破綻させることなく大きな進歩を期待できる仕組みは以下のように考えられます:

# rubygems.org から何らものをフェッチすることを禁止し、
# gem() の振る舞いを Git 使用に変更します。
must 'use-git'

gem 'github.com/rails/rails', 'v8.1.2'

# 間接依存関係("bundle install" などによって自動的に書き込まれ更新されるもの)
indirect do
    gem 'github.com/rails/actionview', 'v8.1.2'
    gem 'github.com/fxn/zeitwerk',     'v2.8.2'
    # ……etc
end
  • Gemfile.lock
    はハッシュ値の記録などには引き続き利用可能ですが(
    go.sum
    と同様の役割)、それ以外の用途においてはそれほど役に立ちません。

おわりに

この仕組みを完全に変更することは困難であり、混乱を招く可能性もあります。しかし、ハイジャックされたパッケージが絶え間ないストリームとして発生する様子に対処することもまた難しいものです。

少なくとも合理的な道筋があるように感じます。あるいは全く別のアプローチもあるかもしれません。重要なのは、責任ある開発者として信頼性を持って依存関係を監査したいと思いつつ、現在の RubyGems や多くのパッケージマネージャーがそれを難しくさせている現実です。

同じ日のほかのニュース

一覧に戻る →

2026/07/06 6:03

Open プリンター

## Japanese Translation: Openprinter は、印刷技術における大きな転換点であり、コンパクトな耐久性と完全な修理可能性、そしてコスト削減および電子廃棄物削減を実現するオープンソースアーキテクチャを統合しています。Raspberry Pi Zero W および STM32 カートリッジ基板といった標準コンポーネントを基盤として構築されており、制限的な DRM を排除しつつ、Wi-Fi、Bluetooth、または USB を介して Windows、macOS、Linux、Android、iOS などの複数のオペレーティングシステムに対応します。このデバイスは高い汎用性を備えており、A4、A3、Letter の標準用紙、長さ 37.5m までのロール、バナーのようなカスタムフォーマットを処理でき、壁取付または机置き(統合されたカッターにより多様な構成が可能)に対応します。ユーザーは、特定の HP カートリッジ(地域によりモデルが異なる)に互換性のある再利用可能な Inkit ボトルを採用する低コストな消耗品戦略から恩恵を受け、モノクロ印刷においてすべての色が不要であっても、600〜1200 dpi の高品質出力を実現します。配布は Crowdsupply 上のクラウドソーシングモデルを通じて行われ、即席で使用できるユニットまたは組立キットが提供されます。さらに、該装置は電話アプリを介して HD ドキュメントキャプチャを含むスキャン機能を統合しています。結局のところ、このアプローチは個々に低価格な技術と統合されたスキャン機能を提供し、持続可能性を促進します。その成否は現在のキャンペーンにおける消費者の採用に依存し、印刷が引き続きアクセス可能な長期的な未来を約束しています。クリエイティブ・コモンズライセンスの下で配布され特許によって保護されている本プロジェクトは、倫理的利用を保証しつつ開示性を維持します。

2026/07/05 23:14

オーガニックマップ

## Japanese Translation: Organic Maps は、MapsWithMe および Maps.Me の背後にあるオープンソースコミュニティによって開発された、ハイキング、自転車走行、車での移動、地下鉄利用のための優れた無料オフラインファーストナビゲーションアプリです。完全におープンストリートマップのデータを動力源とし、アクティブなインターネット接続を必要とせず、かつデータを送信することなく、詳細なオフライン地図、曲がりくねるポイントごとの音声ガイダンス、等高線、高低差プロファイル、Wikipedia アーティクルを含むすべての機能を提供します。本アプリは、ゼロ広告、トラッカー、データ収集、強制登録、「ホームへ連絡」のない厳格なプライバシー設計で際立っており、これらは Exodus Privacy Project および iOS 用の TrackerControl による独立した監査によって検証されています。小さなフットプリントを持ち、1 つのバッテリー充電で 1 週間持つことができ、インターネットなしで機能の 100% をサポートするため、遠隔地域に最適です。Android、iOS、Linux(Flatpak/パッケージ)、Huawei AppGallery、Obtainium、Accrescent、F-Droid で利用可能で、Apache License 2.0 の下で動作し、寄付を通じて開発をサポートすることを可能にするコミュニティ主導のインディーズプロジェクトを育んでいます。本アプリは積極的にグローバルな参加者を招待しており、ベータテストプログラム(iOS 用の TestFlight、Android/Firebase/Flatpak/Linux デスクトップ用)を提供し、問題トラッカー、メール、Telegram、Matrix スペース、GitHub、Bluesky、FOSStodon などのソーシャルメディアプラットフォームなど複数のチャネルを通じてバグ報告、機能リクエスト、アップデートを提供しています。母語が多種類ある地元のコミュニティから支援され、専用の Matrix チャットおよび Telegram グループを通じてサポートされている Organic Maps は、ユーザーに世界を自由に探求できるようにすると同時に、監視慣行を拒否します。

2026/07/06 6:32

Show HN:自宅で作ってきたオープンソースゲームプラットフォーム「Homegames」

## Japanese Translation: Homegames は、アカウントを作成することもなくソフトウェアをインストールすることなく、ユーザーがゲームを楽しみ、作成し、共有できるブラウザベースのプラットフォームです。開発者は簡単なインブレーズアエディターを使用してコードを書き、ライブプレビューを確認しながら変更を即時テストし、マルチプレイヤーセッションを直接実行できます。資産管理は標準機能として搭載されており、ユーザーはファイルをアップロードするか、スタジオ内でコンテンツを描画または記録することもできます。ゲームはユーザーの好みに合わせて公開publishするか、プライベートに保つことが可能です。2018 年以来、GPLv3 ライセンスの下でオープンソースシステムとして構築され、単一サイドプロジェクトとして展開されてきた Homegames は、プラットフォーム全体とその API を個人ハードウェア上でのセルフホスティングを可能にし、元のサイトがオフラインになった場合でも長期的な保存を保証します。第三者サーバーへの依存を排除することで、Homegames はインディペンデント開発者に対する障壁を低下させ、プラットフォームの不安定さから創造的作業を守るための頑丈なインフラストラクチャを提供しています。

依存パッケージは VCS から直接取得する必要があります | そっか~ニュース