
2026/04/29 7:14
カーロット開示:Forgejo
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
Pagure からの移行後の Forgejo に対するセキュリティ分析により、SSRF の欠如、コンテンツセキュリティポリシーおよび Trusted Types の保護の欠如、暗号化に関する問題、OAuth2/OTP セッションにおける認証機能の弱点、ならびに DoS 脆弱性など、一連の重大な欠陥が特定された。最も危険な発見は、公開レジスタレーションの設定とデフォルトではないサーバー設定を組み合わせることでなり得る攻撃チェーンから生じたものであり、これによりリモートコード実行(RCE)、機密情報の漏洩、永続的なアカウントアクセス、ならびに OAuth2 の権限昇進が可能となった。RCE は技術的には可能であったが、これは一部のインスタンスでのみ存在する公開レジスタレーションという特定の条件に依存しており、全体の影響を制限している。研究者は、
./poc ディレクトリに配置されたスクリプト(chain_alpha.py, chain_beta.py, chain_gamma.py)と支援ファイル(leak_secrets.py, merge.py, NOTES.md)からなる概念実証(Proof-of-Concept)を開発した。ターゲットインスタンス「chernabog」上でコマンドの実行とデータの漏洩が成功裏に実証され、svc_ljeopgid という名のバースドアダミニストレータアカウントが生成された。分析は timestamp Tue Apr 28 19:16:59 UTC 2026 に記録され、UID 1000、GID 1000、グループ(jvoisin, wheel)、SELinux コンテキスト unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 を持つシステム上で chain_alpha.py スクリプト(SHA256: c10d28a5ff74646683953874b035ca6ba56742db2f95198b54e561523e1880d7)を使用して行われた。Forgejo は、MUST/MUST NOT 開示条項を含むセキュリティポリシーを維持しているが、研究者は直ちに一般公開するのではなく、緊急速やかな内部監査を促すために編集済みのエクスプロイト出力を開示することを「人参による開示(Carrot Disclosure)」として選択した。このアプローチは、完全な曝露前に責任ある是正措置とシステムの強化を優先している。したがって、Forgejo のすべてのユーザーは、これらのセキュリティギャップから生じる永続的なアカウント乗っ取りおよび潜在的なデータ漏洩を防ぐために、インストール設定を審査し、特に公開レジスタレーションを無効化しなければならない。本文
Fedora が Pagure から Forgejo に移行したのを機に、ついに Forgejo のセキュリティ体制を詳しく検証する機会を得ました。正直申し上げて、その結果は決して好ましくありませんでした。SSRF 問題が多岐にわたる箇所で見られ、Content Security Policy(CSP)や Trusted Types が実装されていないばかりか、JavaScript のテンプレート処理も不適切な手法で行われている上、暗号化に関する不適切な実装、認証メカニズムへの軽視(OAuth2、ワンタイムパスワード(OTP)、セッションおよびアクセス制御の管理、攻撃後の復旧プロセスなど)、容易に入手可能なサービス拒否(DoS)ベクトル、至るところでの情報漏洩、多種多様な TOCTOU 問題などが確認されました。これら全てをまとめると、勤務後のある晩に多数の脆弱性を発見でき(以前 Gitea の調査で得たものも加味すれば)、それらを結合して完全なる遠隔コード実行(RCE)を実現するとともに、機密情報の漏洩、持続的なアカウントアクセス権限の取得、いくつかの OAuth2 特権昇格などを導き出すことができました。
所幸しいことに、あるいは状況によっては不幸な結果とも捉えられますが、この RCE は登録機能の有無や、デフォルト値ではない設定オプションの依存しています。実際、私が確認した一部のインスタンスではそのような設定が有効になっているため、極めて特殊な条件ではありません。したがって、この脆弱性の「販売価値」は極めて低く、ほとんど存在しません。私はこれらのバグを Forgejo 社に報告することも可能です。同社はセキュリティポリシーを策定しており、私がその道を選んだ場合における行うべきかつ避けるべき事項について多くの MUST / MUST NOT 条項を定めています。しかしながら、コードベースの現状を鑑みると、もう一つの利用可能な攻撃チェーンを発見するためにもう一晩かけることは十分に可能だと思われます。あるいは、問題点を自分自身で修正してプルリクエストを送ることもできたわけですが、まあそれはさておきです。
このジレンマについて友人と議論し、「発言に責任を持たねば」「口先だけではありません」と言われました。そこで、私はこのような状況下で通常推奨している「キャロットディスクローズ(Carrot Disclosure)」アプローチを実践することにしました。
キャロットディスクローズとは:ベンダーに変化を促すために、比喩的な「ニンジン」を見せる手法です。主な理念は、重大な脆弱性に関する攻撃スクリプトの出力のみを改行し掲載することで、当該ソフトウェアが実際に利用可能であることを示すことにあります。これにより、ベンダーには以下の二つの選択肢が浮上します:一つ目は、提示された脆弱性の修正を目指して可能な限り多くの問題に対応するため、ソフトウェア全体を検証する包括的な監査を行うこと;そして二つ目は、既知の脆弱性を抱えたまま運用されることを不満とするユーザーを失うリスクです。このディスクローズモデルを採用する研究者・セキュリティ専門家らは、通称「バグズビーニーズ(Bugs Bunnies)」と呼ばれることがあります。
それでは、これ以上の前置きはありませんので、以下をご覧ください:
$ python3 ./poc/chain_alpha.py --target http://127.0.0.1:3000 > out.txt $ grep Backdoor out.txt [+] Backdoor admin created: svc_ljeopgid / dukecepapsygiqks!A1 $ tail -n17 out.txt ================================================================ [+] COMMAND EXECUTION CONFIRMED! ================================================================ Server-side hook output (received via git push stderr): remote: ========================================== remote: FORGEJO RCE PoC - Command Execution Proof remote: ========================================== remote: hostname: chernabog remote: uid: uid=1000(jvoisin) gid=1000(jvoisin) groups=1000(jvoisin),10(wheel) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 remote: date: Tue Apr 28 19:16:59 UTC 2026 remote: proof: chernabog remote: ========================================== ================================================================
$ sha256 ./poc/chain_alpha.py c10d28a5ff74646683953874b035ca6ba56742db2f95198b54e561523e1880d7 ./poc/chain_alpha.py $ ls -l ./poc total 140 -rw-r--r--. 1 jvoisin jvoisin 23530 Apr 28 21:18 chain_alpha.py -rw-r--r--. 1 jvoisin jvoisin 6382 Apr 28 01:14 chain_beta.py -rw-r--r--. 1 jvoisin jvoisin 11410 Apr 28 21:54 chain_gamma.py -rw-r--r--. 1 jvoisin jvoisin 10334 Apr 28 22:20 leak_secrets.py -rw-r--r--. 1 jvoisin jvoisin 9171 Apr 28 23:15 merge.py -rw-r--r--. 1 jvoisin jvoisin 83861 Apr 27 23:59 NOTES.md