
2026/02/21 6:25
Dependabot をオフにします。
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
要約
DependabotはGoプロジェクトで細かいパッケージフィルタリングが不足しているため、頻繁に無関係なセキュリティアラートを生成します。著者はDependabotを停止し、最新の依存関係に対して
govulncheckとテストスイートを実行するスケジュール済みGitHub Actionで置き換えることで、ノイズを劇的に減らしながらも実際の脆弱性は検出できることを示しています。
重要な例として、
filippo.io/edwards25519(v1.1.1)の修正が挙げられます。このパッチはDependabotのデフォルト動作により、関連しないリポジトリ―例えばWycheproof―でも何千件ものPRを生成しました。対照的に、govulncheckは静的解析後に脆弱なシンボルが到達不能であると判断し、著者のプロジェクトでは「脆弱性なし」と報告します。
Go Vulnerability Database はモジュール、バージョン、シンボル、CVE参照などの詳細メタデータを提供しており、こうした精密なフィルタリングを可能にしています。著者は毎日実行されるワークフロー(
go get -u -t ./...)と10:22 UTCに実行されるgovulncheckを組み合わせ、真の脅威に対してのみアラートが上がるようにしています。
CI環境を潜在的なサプライチェーン攻撃から保護するため、ワークフローではgVisorを使用したサンドボックス化ステップ
geomys/sandboxed-stepを採用しています。この手法は、各依存関係のスケジュールではなくプロジェクト自身のリリースサイクルに合わせて依存関係を更新することを推奨し、継続的なバンプなしで早期検出を実現します。
この戦略は、Go Security Team が2020–21年にデータベース品質と静的解析フィルタの改善に焦点を当てたものと一致しており、Geomys のリテーナー契約(Ava Labs、Teleport、Tailscale、Sentry)によって支援されています。著者は他の開発者にも同様のワークフローを採用するよう促し、Bluesky(@filippo.abyssdomain.expert)または Mastodon(@filippo@abyssdomain.expert)でフォローしてもらうことを読者に呼びかけています
本文
Dependabotは騒音機械です
作業をしているように感じさせてくれますが、実際にはもっと有益な作業を妨げてしまいます――特にGoエコシステムのセキュリティアラートについてはなおさらです。
Dependabot を無効化し、代わりに 2 つのスケジュール済み GitHub Actions に置き換えることをおすすめします:
を実行するものgovulncheck- 最新バージョンの依存関係でテストスイートを走らせるもの
小さなケーススタディ
火曜日に、
filippo.io/edwards25519 のセキュリティ修正を公開しました。(*Point).MultiScalarMult メソッドは受信者が恒等点でない場合、不正な結果を返すことがあります。
- Go エコシステムでは主に
を通じてgithub.com/go-sql-driver/mysql
に依存しています(GitHub 上の従属数は 228 k)。filippo.io/edwards25519 - 実際にはほとんど誰も
を使用していません。(*Point).MultiScalarMult
昨日、Dependabot が影響を受けていないリポジトリに対して何千件もの PR を作成し、
filippo.io/edwards25519 の更新を提案しました。これらの PR には意味不明な CVSS v4 スコアと、アップデートがエコシステムで引き起こす破損に基づく 73 % の互換性スコアというセキュリティアラートも付いていました。v1.1.0 と v1.1.1 の差分は、誰も使っていないメソッドの一行です。
さらに、
Wycheproof リポジトリにもアラートが届きましたが、こちらは該当パッケージを全くインポートしていません:
$ go mod why -m filippo.io/edwards25519 # filippo.io/edwards25519 github.com/c2sp/wycheproof/tools/twistcheck filippo.io/edwards25519/field
Dependabot をオフにしました。
本格的な脆弱性スキャナを使う
しかし、攻撃者が古い脆弱性を利用するのを防ぐためにこの手間は避けられないのでしょうか? まったくそうではありません!
コンピュータは無関係なアラートを除外できます。Go Vulnerability Database は Go のすべての脆弱性について、バージョン・パッケージ・シンボルに関する豊富なメタデータを提供しています。
例:filippo.io/edwards25519
の脆弱性
filippo.io/edwards25519modules: - module: filippo.io/edwards25519 versions: - fixed: 1.1.1 vulnerable_at: 1.1.0 packages: - package: filippo.io/edwards25519 symbols: - Point.MultiScalarMult summary: Invalid result or undefined behavior in filippo.io/edwards25519 description: |- Previously, if MultiScalarMult was invoked on an initialized point who was not the identity point, it produced an incorrect result. If called on an uninitialized point, it exhibited undefined behavior. cves: - CVE-2026-26958 credits: - shaharcohen1 - WeebDataHoarder references: - advisory: https://github.com/FiloSottile/edwards25519/security/advisories/GHSA-fw7p-63qq-7hpr - fix: https://github.com/FiloSottile/edwards25519/commit/d1c650afb95fad0742b98d95f2eb2cf031393abb source: id: go-security-team created: 2026-02-17T14:45:04.271552-05:00 review_status: REVIEWED
適切なスキャナは少なくともパッケージ単位でフィルタリングできます。例えば
go list -deps ./... を使うと、モジュールが機能をサブパッケージに分けている場合、多くの騒音を消せます。
第三者製スキャナを使用する場合は パッケージレベルでのフィルタリング を要求してください。優れたスキャナは、静的解析によって脆弱シンボルへの到達可能性も考慮します――これが
govulncheck の機能です!
$ go mod why -m filippo.io/edwards25519 # filippo.io/edwards25519 filippo.io/sunlight/internal/ctlog github.com/google/certificate-transparency-go/trillian/ctfe github.com/go-sql-driver/mysql filippo.io/edwards25519 $ govulncheck ./... === Symbol Results === No vulnerabilities found. Your code is affected by 0 vulnerabilities.
govulncheck は、あなたのプロジェクトが github.com/go-sql-driver/mysql を通じて間接的に filippo.io/edwards25519 に依存していることを認識しますが、脆弱シンボルは到達できないため通知しません。
パッケージレベルとモジュールレベルの一致を要求するには:
$ govulncheck -show verbose,color ./...
Dependabot を govulncheck
GitHub Action に置き換える
govulncheckname: govulncheck on: push: pull_request: schedule: # UTC 10:22 毎日 - cron: '22 10 * * *' workflow_dispatch: permissions: contents: read jobs: govulncheck: runs-on: ubuntu-latest steps: - uses: actions/checkout@v5 with: persist-credentials: false - uses: actions/setup-go@v6 with: go-version-file: go.mod - run: | go run golang.org/x/vuln/cmd/govulncheck@latest ./...
これにより、毎日実行され、実際に注意すべき脆弱性がある場合のみ通知されます。
アラート疲れのコスト
誤検知は時間を浪費し、セキュリティを低下させ、アラート疲れを引き起こします。適切なトリアージも不可能になります。本物の脆弱性は本番環境への更新、シークレットローテーション、ユーザー通知など実際の評価が必要です。日常的に発生する低価値 Dependabot アラートに対しては、依存関係を単にバンプするだけでは不十分であり、実際には現実的な対応策になります。
Go Security Team は Go Vulnerability Database の人員配置と静的解析フィルタリング付きスキャナの実装に投資しています。
govulncheck Action は自動で PR を作成しません――それが良い点です!セキュリティアラートがほぼ騒音になるので、真剣に検討できるようになります。
更新ではなく最新バージョンでテストする
Dependabot はセキュリティ脆弱性の有無に関係なく依存関係を常に更新します――これは誤った実践です。
依存関係は開発サイクルに合わせて更新すべきであり、個々の依存関係のサイクルではありません。
高速更新には 2 つのメリットがあります:
- 破損を迅速に検出・修正できる。
- セキュリティ脆弱性が発生した際にパッチ差分を小さく保てる。
CI を毎日最新バージョンで走らせれば、両方のメリットを得られます。テストスイート実行前に
go get -u -t ./... を実行してください。
name: Go tests on: push: pull_request: schedule: # UTC 10:22 毎日 - cron: '22 10 * * *' workflow_dispatch: permissions: contents: read jobs: test: runs-on: ubuntu-latest strategy: fail-fast: false matrix: go: - { go-version: stable } - { go-version-file: go.mod } deps: - locked - latest steps: - uses: actions/checkout@v5 with: persist-credentials: false - uses: actions/setup-go@v6 with: go-version: ${{ matrix.go.go-version }} go-version-file: ${{ matrix.go.go-version-file }} - uses: geomys/sandboxed-step@v1.2.1 with: run: | if [ "${{ matrix.deps }}" = "latest" ]; then go get -u -t ./... fi go test -v ./...
このアプローチは安全です。悪意あるコードが依存関係に追加されても、CI にしか届かず本番環境には影響しません。サプライチェーン攻撃は寿命が短いので、sandboxing(例:
geomys/sandboxed-step は gVisor を使用)でさらにリスクを軽減できます。
参考文献
Bluesky で @filippo.abyssdomain.expert、Mastodon で @filippo@abyssdomain.expert にフォローして、オープンソースに関する意見をもっと聞いてください。
写真の説明
Tevere が下流域を超過し、多くの以前は馴染み深かった風景がわずかに変化しました。これは河川岸に安全に降り立つことができた後、撮った最初の写真です。
私の仕事は Geomys によって支えられています。Geomys はプロフェッショナルな Go メンテナを集めた組織で、Ava Labs、Teleport、Tailscale、Sentry の資金提供により、オープンソース保守作業の持続可能性と信頼性を確保し、私や他の Geomys メンテナの専門知識への直接的なアクセスを提供しています。
Teleport – 過去 5 年間で攻撃は従来型マルウェアからソーシャルエンジニアリング・クレデンシャル盗難・フィッシングによる有効ユーザーアカウントの乗っ取りへと移行しました。Teleport Identity は監視を通じて弱いアクセスパターンを排除し、アクセスリクエストで攻撃表面を最小化し、未使用権限を必須レビューで削除します。
Ava Labs – 私たち Ava Labs は AvalancheGo(Avalanche ネットワークとの対話に最も広く使われているクライアント)のメンテナです。オープンソースの暗号プロトコルの持続可能な保守と開発は、ブロックチェーン採用を拡大する上で不可欠だと考えています。この重要作業を支援するために、Filippo と彼のチームへの継続的なスポンサーシップを行っています。