カーロット開示:Forgejo

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

同じ日のほかのニュース

一覧に戻る →

2026/04/29 4:44

Ghostty は GitHub から撤退します。

## Japanese Translation: GitHub ユーザー 1299 が 18 年にわたり作成・維持してきたターミナルエミュレータ Ghostty が、プラットフォーム上の重要なインフラ障害の発生により、創始者が現在それを重大な業務に不適切と見なし始めたことを受け、公式に GitHub を離れる予定である。最近の GitHub Actions の停電は数時間ほど PR レビューをブロックし、これは Git そのものの問題ではなく GitHub サービス自体の構造的な問題を浮き彫りにしている。同月中盤の主要な GitHub 障害(同日に Elasticsearch の障害も発生したが別の事件)と時期を同じくしてこの週に終了した議論が、プロジェクトの移行計画を見事に実現させながら、現在の URL で即時のコードアクセスのために読み取り専用ミラーを維持するという方針で進められた。創始者は、新たなホスティングソリューションを探す過程で、商業的およびフリーソフトウェアの複数のプロバイダーから依存関係を段階的に削除していくことを意図している。この動きは、不揃いなサービスレベルを持つ主要プラットフォームに依存するオープンソースプロジェクトの長期的な持続可能性に対する業界全体の懸念の高まりを示しており、維持者は利便性よりも安定性を最優先することを促している。

2026/04/29 8:54

ChatGPT も広告を表示しています。以下がその全体的な帰属循環のプロセスです。

## Japanese Translation: OpenAI は、ChatGPT に独自の広告システムを直接統合し、SSE ストリームに `single_advertiser_ad_unit` オブジェクトを注入し、クリエイティブ資産を独自ドメインである `bzrcdn.openai.com` 上にホストしています。ブラウザには OAIQ v0.1.3 という追跡用 SDK が実行されており、製品の閲覧情報を OpenAI のサーバーへ報告しています。このシステムは Fernet 暗号化されたトークン(例:`ads_spam_integrity_payload`, `oppref`, `olref`, `ad_data_token`)を使用しており、これらは公衆向けのヘッダーバイトを 9 文字含み、トークンの発行時刻の復元を可能にしています(例:2026 年 4 月 26 日)。クリックされたリンクは外部ではなく ChatGPT の内部ウェブビュー内(`open_externally: false`)で開かれるため、OpenAI はクリック後のナビゲーションを観察できます。アトリビューションチェーンには、720 時間の有効期限を持つファーストパーティcookieに格納されるフォワードトークン(`__oppref`)と、impression ログを記録する `olref` が使用されます。コンテキストターゲティングは、北京旅行、フライト、NBA など 6 つの異なる会話トピックで確認されています。広告出稿元には Grubhub や GetYourGuide があります。追跡を軽減するには、ドメイン `bzrcdn.openai.com` と `bzr.openai.com` をフィルタリングし、cookie(例:`__oppref`, `__oaiq_domain_probe`)を確認する必要があります。

2026/04/29 6:17

GitHub に至るまで

## 日本語訳: 中心的な論点是、GitHub が有用なツールから、オープンソースのアイデンティティに依存する脆弱で中央集権的なインフラへと進化しすぎているという点にある。この依存関係は危険であり、企業の管理不備と不安定性が、過去の記録と長年にわたって構築されたコミュニティへの信頼の双方を脅かしている。GitHub はコード共有を円滑化させ、事実上のプロジェクト放棄フォーク、イシュー、議論などのアーカイブとなったが、その台頭は npm エコシステムなどにおけるマイクロ依存関係の爆発的増加と同時期に起きたものである。 GitHub を以前に、オープンソースは評判、メーリングリスト、信頼できるメンテナ、そしてより多くの管理努力を要するが制御とコミュニティの文脈を保持できる自己ホスト化インフラ(例:Trac、Subversion)などに基づいていた。Git の分散型の性質が広く普及したにもかかわらず、GitHub はホスティングを単一の商用エンティティに集約し、これはソフトウェアコモンズの皮肉な中央集権化である。今日では、いくつかのプロジェクト(Ghostty、Strudel、Tenacity など)は、不安定なベンダーへの依存を回避するために、Codeberg などの独立したホスティングへ移行している。 今すぐ必要なのは、商業的モデルから完全に切り離された、公衆向けの資金を十分に得たアーカイブを作り、重要コード、リリースアソートメント、およびセキュリティ勧告や設計論争などを含む歴史的議論を保存することである。現在のようにプラットフォームの変更や急激な移行によって消えてしまう場合である。そのようなレジリエントなバックアップがない場合、業界は社会的歴史の不可逆的な損失に直面し、コミュニティが孤立しデータが脆弱になるリスクを抱えることになる。著者は GitHub の回復を望みつつも、オープンソースの歴史に対して単一のプラットフォームへの依存は無責任であると論じており、将来には pre-GitHub 時代の教訓と GitHub エポックの実態とのバランスが必要であるべきである。

カーロット開示:Forgejo | そっか~ニュース