otterdogのwebappに認証不要のコード実行脆弱性、修正版あり
Eclipse Foundationのotterdogのwebappで、GITHUB_WEBHOOK_SECRET未設定だと認証なしにコードを実行される脆弱性が公表されました。webappを動かしているなら、この値の設定有無を確認し、修正版への更新も進めてください。
急ぎ度: 至急
CVSS v4は9.5で、認証なしにネットワーク越しでコードを実行でき、勧告に再現手順が載っているため、署名用シークレット未設定のwebappは公表当日から確認が要ります。
関係があるか
otterdogのwebappを、ソースの取得またはghcr.io/eclipse-csi/otterdogのコンテナで運用している組織が対象です。webhookの署名用シークレットを設定していない環境が、実際に攻撃を受けるおそれのある環境です。
| 製品 | 影響を受ける版 | 修正版 |
|---|---|---|
| otterdog webapp(ソース取得、またはghcr.io/eclipse-csi/otterdogのコンテナ) | 0.9.0以上1.3.2未満(GitHubの勧告本文は、公開時点のmainまでの全版としている) | CVE記録では1.3.2。GitHubの勧告は修正版を1.3.3と記載しており、食い違っている |
| otterdog(PyPIで配布されるパッケージ) | 影響なし。webappはwheelから除外されている | 該当なし |
確かめ方
- 1otterdogのwebappを自組織で動かしているかを、コンテナ一覧やデプロイ手順書で確認します。pipでotterdogを入れて使っているだけなら、このwebappは含まれません。
- 2webappの環境変数GITHUB_WEBHOOK_SECRETが設定され、空でないかを確認します。未設定または空なら、署名検証が働いていません。
- 3動いているwebappの版が1.3.2未満かを確認します。
- 4POST /github-webhook/receiveへ、GitHub以外のネットワークから到達できるかを確認します。同梱のコンテナ設定では0.0.0.0:5000で待ち受けます。
何が起きたか
otterdogのwebappに、外部から届いたデータをそのままPythonのコードとして実行してしまう脆弱性が見つかり、2026年11月9日に公表されました。
webappはGitHubのwebhookの本文から文字列を組み立て、その結果をPythonのeval()で評価しています。評価されるのは、本文のactionという値を埋め込んだ式です。分類はCWE-95(動的に評価されるコードの不適切な無害化、いわゆるeval injection)です。
本来はHMAC署名の検証で、GitHub以外からの通知は弾かれます。ところがGITHUB_WEBHOOK_SECRETが未設定または空だと、この検証が丸ごと省かれます。コード上の既定値はNoneで、シークレットがなくてもwebappは警告なしに起動します。気づかないまま署名検証が無効になっている環境があり得る点が、運用上の落とし穴です。
攻撃の流れ
-
1
窓口に到達
攻撃者がwebhookの受信用エンドポイントにHTTPリクエストを送れる位置にいます。
-
2
署名検証が省略
シークレットが未設定または空のため、HMAC署名のチェックが行われません。
-
3
本文が式に混入
リクエスト本文のactionの値が、評価用の式の文字列に埋め込まれます。
-
4
コードが実行
eval()が式を評価し、webappのホスト上で任意のPythonコードがwebappプロセスの権限で動きます。
どう悪用されるか
悪用に認証は要りません。webhookの受信エンドポイント(既定ではPOST /github-webhook/receive)にHTTPリクエストを送れるネットワーク上の位置にいれば足り、利用者の操作も不要です。
前提は、デプロイ側でGITHUB_WEBHOOK_SECRETが設定されていないことです。空でないシークレットが正しく設定されていれば、有効な署名を作れるのはGitHubだけです。GitHubが送るactionの値は、安全な固定の値に限られます。そのため、勧告によれば細工した値は式まで届きません。
悪用に成功すると、webappのプロセス権限で任意のコードが動きます。CVSS v4の評価では、脆弱なシステムと連携先の両方で、機密性・完全性・可用性への影響がいずれも高とされています。
今すぐやること
-
1
シークレットの設定を確認する
運用中のwebappで、GITHUB_WEBHOOK_SECRETが設定され空でないかを調べます。値そのものを画面やログに出さない形で確認してください。未設定または空なら、更新を待たずに空でないシークレットを設定し、GitHub側のwebhook設定にも同じ値を入れて再起動します。
docker exec <コンテナ名> sh -c 'test -n "$GITHUB_WEBHOOK_SECRET" && echo set || echo unset' -
2
修正版へ更新する
CVE記録は1.3.2を修正版としています。一方、GitHubの勧告は修正版を1.3.3と書きつつ、本文では未修正とも書いており、記録どうしが食い違っています。まず動いている版を確認し、1.3.3以降が出ているかをプロジェクトの告知で確かめて、出ていればそちらへ更新してください。1.3.2以上であることは最低限の条件です。
docker image ls ghcr.io/eclipse-csi/otterdog -
3
未設定だった期間の痕跡を調べる
シークレットが未設定のまま、エンドポイントがGitHub以外からも到達できる状態だった場合は、受信ログに身に覚えのないリクエストがないかを調べます。webappのホストで想定外のプロセスやファイルがないかも確認します。
-
4
webappが扱う認証情報の入れ替えを検討する
痕跡が見つかった場合、またはログが残っておらず調べられない場合は、webappのプロセスが読める認証情報(GitHub関連のトークンや鍵など)を新しいものに替えます。
すぐ更新できないとき
すぐに更新できず、シークレットの設定も済ませられないときは、webhookの受信エンドポイントへの接続元をGitHubからの通信に限定します。それも難しければ、設定が済むまでwebappを止めておきます。
背景
otterdogは、Eclipse Foundationが公開しているツールです。GitHub組織の設定を管理する用途で使われ、webappはGitHubから届くwebhookを受け取って処理します。webhookの受信口は、外部から届く通信を受ける入り口です。そのため、送信元がGitHubであることをHMAC署名で確かめる処理が、そこを守る唯一の関門になります。
今回の脆弱性は、その関門が設定次第で何も確認しなくなる点に特徴があります。勧告によれば、導入手順の文書にはシークレットを設定するよう書かれています。しかしアプリは未設定でも警告なしに動き、検証は黙って無効になります。しかも、署名を通らない本文の値が、無害化されないままeval()に渡る作りでした。署名検証の抜けと、評価コードへの入力混入が重なったことで、深刻な評価になっています。
よくある質問
Q.シークレットを設定すれば、更新しなくてもよいのですか。
この記事は、取得元の公開情報をもとに、人が監修しながらAIを活用して執筆しています。執筆と監修は佐々木 航が担い、公開したあとも人が内容を確認しています。誤りに気づいたときは直し、記事の末尾に訂正の行を残します。対応を決める前に、下の原文と参照先も確認してください。
影響パッケージ
| パッケージ | 影響を受ける版 → 修正版 | |
|---|---|---|
| Eclipse Foundationotterdog |
0.9.0 以上 1.3.2 未満→ 1.3.2 |
1.3.2 |
原文の説明 取得元が公開している説明をそのまま載せています (多くは英語)。
The otterdog webapp evaluates a format-string built from the incoming GitHub webhook JSON body using Python's eval(). When the GITHUB_WEBHOOK_SECRET configuration value is unset or empty (the code default is None), the HMAC signature check is skipped entirely, allowing an unauthenticated network client to reach the eval() sink with attacker-controlled input and execute arbitrary Python on the webapp host.
出典: CVE.org (CVE Program・cvelistV5) NVD GitHub Advisory
参照URL
- advisory github.com
- advisory github.com
- advisory nvd.nist.gov
- package github.com
- patch github.com
- web gitlab.eclipse.org
- web pypi.org