マジかよ!?SAML SSO認証にバイパス脆弱性!誰でもなりすませるってマジ?
引用元:https://news.ycombinator.com/item?id=43374519
GitHubのSAML実装はマジで使えねーわ。自分のアカウントを企業に持ち込むってのは、サイト上ではなんとかなるけど、GitHubでログインするアプリが、組織レベルで許可しちまうと組織のメンバーシップを読めなくなるのを防げないんだよねー(許可しなかったら、OAuthトークンから隠されちゃうけど、ちゃんと機能は持ってんの!)。SAMLセッションが必要なのは、アプリがユーザーから取得したトークンでデータを取得する場合だけーで、ざっと見た感じ、そんなケースほぼない。SASTツールは大抵アプリインスタンスのトークン使うし、GitHubアカウント持ってるやつなら誰でも組織のコード見せびらかしてくる。Tailscaleは指摘したら直してくれたけど、Sonarcloudは「誰にも言わないで」って言われたし、GitHubは数週間かけて「想定通り」って言ってきた。マジかよ。セキュリティバグ報告ってマジで報われない。たまたま見つけただけでもそう思うわ。仕事でやってる人とか尊敬する。
>The idea is that you can bring your own account into an enterprise
>ってことは認証だけの問題じゃないんだよね。GitHubがたまに、マジでたまーに、仕事のPRをマージする時に、デフォルトで個人のメルアド使ってくることがあるんだわ。誰かに聞かれたら、GitHub(とか他の場所)で、個人のと仕事のをごっちゃにしない方がいいってアドバイスしてる。
だからアカウントとデバイスの分離にはマジで神経質になっちゃうんだよね。Gitのプロファイルすら信用してない。GitKrakenのライセンスは、たとえ避けられたとしても、転職するたびに新しいの買ってる。個人的なGitHubで仕事のGitHubにコミットしようとしたり、その逆とか、ありえないからね。Microsoftアカウントとそのヤバい技術的負債が原因のスパゲッティも同じ。例えば、iOSのOutlookにログインしようとすると、「システム管理者がデバイス全体をリモートで制御してワイプできる」みたいな脅迫メッセージが表示される。無能なIT部門が悪意を持って個人のデバイスをワイプする可能性があるなら、マジ勘弁。あと、HNのスレで、父親が子供にラップトップを使わせたら、子供が学校のMicrosoftアカウントにサインインして、なぜか父親の個人のMicrosoftアカウントが学校のアカウントに統合されて、どうやっても直せなくて、学校のIT部門も気にしなかったって話もあったな。
iOSだけじゃなくて、AndroidのOutlookも同じことするよ。皮肉なことに、Teamsは同じようなことしないから、緊急の用件があるときは、Teamsに送ってくれって言ってる。Outlookは絶対インストールしないから。
組織によるんじゃない?今はコントロールがもっと細かくなってると思うよ。例えば、個人のスマホにTeamsとOutlook入れてるけど、できることはアプリの削除だけ。スクリーンショットは真っ白になるし、コピー&ペーストもできない。
MAM vs MDMね。MAMは、開発者がSlackで連絡できるようにしたいけど、MDMを個人のデバイスにインストールするのは(当然のことながら)嫌がる場合に有効ー少なくともうちの会社はそう思ってるみたい。
なんでそんな変なアカウント名使うんだ?個人のアカウント使えばいいじゃん?って言われた時、「マジかよ」って思ったわ。SAMLとか関係なく、仕事とプライベートは混ぜるなっていう主義だからね!顧客にメール送るのに個人のメールアドレスは使わないよ。
仕事用の2FAとか、職場のタスクに個人の携帯使うのって普通になってきてるよね。会社支給の端末を要求すると、もう持ってるじゃんって不思議がられる。個人の車でも同じようなことあるし。仕事とプライベートを分けるって考え方は古臭くなってきてるのかもね。
それマジわかる。だから、電話番号をIDとして扱うべきじゃないんだよ。
ここで言うコネクションってどんな感じ?詳しく教えて!
個人のidentityを、本人がほとんど管理できなくて、複数持ちにくいものに結びつけるのはどうなの?特に、個人用、準 профессиональный、 NSFW用、仕事用(でもサービスが要求するXを持ってない)とか、3つ以上欲しい場合もあるじゃん。
うちの会社は、従業員が辞めた後の問題を防ぐために、仕事で個人のGitHubとかFacebook、Instagramとかを使うのを一切禁止してるんだよね。
組織から削除すればよくない?
GitHubのログイン名を<company_name>LIESとかに変えられたら、過去のPRとかIssueに全部残っちゃうじゃん。顧客が見る可能性のある公開リポジトリにも。
それって、個人のアカウントより、仕事専用のGitHubアカウントの方が当てはまるよね?どっちにしても、会社から削除されてもログインしてアカウント名を変えられるし。共有じゃなければ個人のアカウントも傷つかないし…だよね?これって実体験?
仕事専用のアカウントなら、会社はいつでもアカウントを乗っ取れる(必要ならメールリセットとかで。だって仕事のメールアカウントは会社のものだし)。で、好きなようにできる。
仕事専用のアカウントで、仕事のメールアドレスを使う場合ね…そこが抜けてた。でも、そうするとオープンソースの活動履歴が全部消えちゃう。採用とか履歴書で重要なのに。
仕事用と個人用の両方のメールアドレスを記載したキーで、コミットに暗号署名する方法もあるよ(会社のポリシーが許せば)。そうすれば、会社は管理できるけど、あなたも自分のやったことの証明になる。
もし会社のGitHubの履歴からあなたを消そうとするなら、署名済みのコミットを新しいコミットに置き換えることもできる。あなたはその仕事に対する法的権利を持ってない可能性が高いし、gitは履歴を書き換えられるし。
国によるね。アメリカでは、著作権譲渡は通常永久的。EUやカナダでは、権利を取り戻せる場合もあるし、”道徳的権利”によって、会社が”悪いこと”をしたら使用を取り消せる場合もある。
アメリカでも、会社が”契約違反”をした場合、あなたのコードを全部削除させられる。
EUとかカナダでも、仕事でやったことに対する著作権はないと思うよ。会社のために作ったものの著作権は、できた瞬間から全部会社のもの。 「人格権」について調べてみて。道徳的に問題がある場合、自分の作品の使用を取り消せる場合があるよ。 一部の国では、著作者は人格権を譲渡・譲渡したり、主張しないことを認めたりできるんだって。普通はちゃんと書面でする必要があるみたいだけどね。 >gitは履歴をめちゃくちゃに書き換えられるよね。 署名なしのcommitも同じじゃない?commit hashを変えずにcommitのメタデータを変更できるの? >もちろん、署名なしのcommitも同じじゃない? 質問なんだけど、commitに署名するのは本当に役立つの?commitが署名されていても、リポジトリの履歴から自分を消すのは同じくらい難しいんじゃない? もし意地悪な元雇用主が、誰かが辞めたときに公開リポジトリのcommit履歴から元従業員の名前を消したいと思っても、止めることはできないと思う。やる価値があるよりも面倒だし、規模が大きくならないと思うけどね。そうじゃなければ、会社のメールアドレスにまだあなたの名前が入っていれば、やった仕事の功績を失うことはないと思うよ。 会社のメールアドレスへのアクセスが取り消される前に変更すればいいんじゃない? メールアドレスを隠すときに取得できるGitHubが生成したメールアドレスを使えばいいんじゃない? GitHubって、個人向けアプリにビジネス機能が無理やりくっついてる感じがするんだよね。うちの会社じゃ、GitHubだけが個人アカウントと仕事用システムがごっちゃになっててマジ困ってた。だからForgejoを試してみたらGitHub(とかGitLab、Gitea)より良かったから乗り換えたんだ。前の会社じゃみんな個人のGitHubアカウントを仕事で使ってたけど、エンタープライズ機能とか言い出して、従業員のSSOとか約束し始めたら、オンプレミスに逃げちゃった(GitHub EEじゃなくてね)。 複数のGithubアカウントを使うのは利用規約違反だよ。 ユーザーメニューの上にある、二つの反対向きの矢印のボタンに気づいたかな?それをクリックしてみて。 ベンダーさんたちを擁護すると、Githubってマジで色々やりにくいんだよね。リポジトリとかコミットとかPRを分析するツール(https://dev.log.xyz)を作ったんだけど、「Githubで見れるものはDevlogでも見れる」ようにするのがめっちゃ大変だった。OAuthの権限を選ぶ画面もマジで分かりにくいし。Githubでログインする時、どの組織の何の情報を共有してるのか全然わかんない。 >Githubが色々やりにくいってマジ?「Githubで見れるものはDevlogでも見れる」ようにするのがめっちゃ大変だったって言うけど。 このエンドポイント、ちゃんとテストすべきだったわ。GitHubのSAML実装って別のチームがやってて、いつも品質がイマイチで、データのパッチも汚いんだよね。例えば、通知のフィルタリングがテンプレートエンジンの中で行われてて、SAMLで全部制限されてると、ヘッダーだけ表示されて、その下に「すべてキャッチアップ」って表示が出ないし、「1-0/113」とか表示される。GitHub Enterprise Cloudってマジで色々貼り付けられてるだけだなって思うわ。 これ、どこでも同じだよ。若い開発者ってJavaScriptで育ってるから、クライアントサイドの検証だけじゃ不十分だってことを信じさせるのがマジで大変。ましてや、要件とか予算を決めるビジネスオーナーに理解させるなんて無理ゲー。 「JavaScriptで育った若い開発者にクライアントサイドの検証だけじゃ不十分だってことを信じさせるのが難しい」って言うけど、それってJSplainingじゃない? それは経験させないと分かんないんじゃない?もしそれで満足してるなら、バグ見つけたら10ドルあげるって言って、そいつのブランチをハックしてデプロイしてみれば?そんで10ドルは没収して、教訓を覚えてもらう。 マジか。クライアントサイドの検証を信じちゃいけないってことを人に信じさせるのが、そんなに大変だなんて思わなかった。「自分が書いたコードにはXSSとかSQLインジェクションの脆弱性はない」とかなら、まだ信じられるけど。クライアントサイドの検証を信じるってありえないでしょ。 SAML導入したけど、この記事のタイトルは全然驚きじゃないなー。SAMLの仕様自体はまあまあだけど、XML署名(とXML正規化)がマジでヤバいんだよね。あんなの委員会じゃないと作れないって。署名をアウトオブバンドで送るだけで、SAMLはもっと楽になるのに。 もっとヤバいよ。XMLは拡張可能なマークアップ言語だから、SAMLの標準化委員会が独自の拡張メカニズム言語を作っちゃったんだもん。認証クッキー程度のデータに、プロトコルの上にプロトコルを重ねるなんて、 бюрократический な委員会しか思いつかない。 SAMLの人たちが一番ヤバいわけじゃないよ。XML署名が一番ヤバいんだって(xADESとかSOAPとかにもある)。内部プラットフォーム効果を避けるために、署名を構造自体に埋め込むようにしたから、こういう問題が起きるんだよね。JWTはJSONの中にJSONだけど、少なくともアーキテクチャ的にはこういう問題は避けてる。 SSOってマジで救いようないのかな?アカウントに個別にログインする方が良くない?アカウントを繋げるって、全部 megacompromised になるリスクがあるってことじゃん。 SAMLだけがSSOの標準じゃないよ。SAMLの前はKerberosがあったし、今はOpen ID Connectもある。他の標準にも問題はあるけど、SAMLはマジでひどい。SSOの脆弱性は一部のクライアントにしか影響しないことが多いけど、プロバイダー全体が壊れることは少ない。だから、複数のアカウントを持つよりSSOの方が安全だと思うよ。 一番の問題は、ユーザーが全部同じパスワードを設定して、’SSOみたいなこと’をしちゃうこと。弱いシステムが攻撃されたら、組織全体で有効なクレデンシャルが漏洩する。パスワードマネージャーを使うべきだけど、現実的には無理。オンボーディングとかオフボーディングも面倒だし、サポートも大変。セキュリティ対策も全部のシステムで実装しなきゃいけないしね。 >Having decentralised authentication means that onboarding and offboarding need to have a bunch of tedious manual steps, or custom automation.” ’If there are regulatory requirements for account lockouts’ OIDCはSAMLよりマシだけど、ハードル低いよね。OIDCにも問題はあるけど。 OIDCの問題はSAMLとは全然違うんだよね。 SAMLの代わりにOIDCをSSOに使うこともできるよ。 SAML(もっと広く言うとXML-DSIG)はマジで一番ヤバいセキュリティプロトコルだと思う。OAuthに移行するために必要なことは全部やるべき。少なくとも、SAMLに頼る新製品は絶対に出したくない。マジで危険。実用的な形式検証でブレークスルーがない限り、これがDSIGの最後の脆弱性になることはないと思う。 いつかXML DSigがやらかしてるアホなこと全部エッセイに書きたい。暗号化とか抜きにしても。企業のソフトウェア脳って感じ。 ぜひそれについて書いてください。マジで読みたいです。 Security Cryptography Whatever’sの今週のSAMLについてのくだらない話はマジで楽しみ。 マジか、考えたことなかったけど、確かにそれやるべきだわ。サンキュー! infosecのグチを言うポッドキャストに登録したい。VTuberじゃないやつに月5ドルPatreonでサブスクしたいわ。 俺の理解が間違ってるかもしれないんだけど、SAMLにはSSOプロバイダーがセッションをキャンセルできるっていう利点があるんだよね?それってマジ? マジで?多くのSAMLのセットアップでは、IDPとサービスの間に直接的なネットワークインタラクションはないんじゃない?せいぜいURL経由でメタデータを共有するくらい。 MicrosoftがAzure/M365でこれ実装してるよ。 OIDCにはアウトオブバンドのバックチャネルログアウトがあるよ。 REXMLは他に選択肢がない時以外マジで使うべきじゃないよ。無効なXMLも平気でパースしちゃうから、後々無限に問題が起きるんだよね。正規表現でXMLをパースするってマジありえない。Nokogiriが使われるようになったのは性能だけじゃなくて、正確だから。 >正規表現でXMLをパースするってマジありえない。”正規言語じゃないものを正規表現でパースするなっていう教科書的な例だよね。 もっと言っちゃうと、正規表現でパースするなって話。検索(テキストに探してるものが含まれてるか)に使うべきで、パース(非構造化入力から構文木を作る)に使うべきじゃない。 AIコードアシスタンスのリスクの一つは、大規模なコードベースで使われるライブラリについて、全体像を見てるとは限らないことだよね。o3をテストしてたとき、ライブラリと関係ない問題を直そうとするたびに、コードブロックで使われてるライブラリが勝手に変わってた。 Samlは設計上安全じゃない。他の人も言ってるけど、例えばhttps://joonas.fi/2021/08/saml-is-insecure-by-design/とか。Parser differentialsは想定されてるし、必要なことでもある。AWS SigアルゴリズムはV4は理論上安全だけど、SigV1とSigV3は設計上安全じゃなかった。 これは素晴らしい記事だね。ahacker1に感謝。SAML実装を安全にするために、すごい高度で価値のある仕事をしてる。SSOReadyの俺たちは彼の仕事に感謝してる。WorkOSも彼とのコラボについて記事を書いてるよ: https://workos.com/blog/samlstorm >GitLabでこの脆弱性の悪用可能なインスタンスを発見し、セキュリティチームに通知したよ。”GitLabが修正をリリースしたみたい: https://about.gitlab.com/releases/2025/03/12/patch-release-g… 関連情報として、Latacoraの(2019)年の記事、「JSONオブジェクトに署名する方法(とその落とし穴)」[1]があるよ。 もっと単純な結論として、署名があるべき場所を探すべきじゃないかな? むやみやたらにXPathの”//ds:Signature”みたいなのを使って、想定外の場所にある署名を見つけようとするんじゃなくてさ。 脆弱性への対応って、甘すぎる気がするんだよね。全部捨てて、危険な部分だけを取り除くことができないから、大規模な化学療法みたいになっちゃうんだ。 >XML解析が一週間で二回も問題になってるから、今後は避けるべきで、XMLをJSONに置き換えるポリシーってどうなの? ある程度の規模の組織(例えば10人以上)なら、SSOを展開しないのは職務怠慢だよ。SSOの目的は、単一の管理ポイントと必須の2FAスタックを持つことなんだから。 このJSONを正しくパースして セキュリティが重要な状況では、パーサーは重複キーがあったらエラーを返す必要があるよね。一般的なパーサーがどうとか、RFCがどうとか関係なく。 Javaだと、gsonじゃなくてJacksonのことじゃないかな? もしかしたら変わったのかもしれないけど。あの大御所でも間違えることがあるってことだね。 最後のやつで上書きするよ。 過激な意見だけど、ウェブ開発者がセキュリティ関連のコードに触れないようにするのが一番だと思ってる。設計、プロトコル、データフォーマットからね。ウェブ開発の習慣や設計思想は、セキュリティが必要なコードには合わないんだよ。むしろ逆効果になることさえある。 ウェブ開発者のスキルを責めるのはフェアじゃないと思うな(でも、JavaScript使ってleftpaddingしてるなら自業自得かも)。ウェブソフトウェアってリスクがめっちゃ高いし、100%繋がってるから、他のどんなものより100倍危ないんだよね。 ブログ記事で脆弱性を説明しといて、問題のparser differentialを省略するのはちょっとイラっとくるな。まるで物語の導入部分だけ書いて、クライマックスを省くみたいなもんじゃん。もっとコメントを表示(1)
もしあなたが会社の請負業者なら話は別だけど。従業員なら、仕事で書いたコードの著作者としての権利はないんじゃないかな。
技術的にはそうだけど、代償が大きすぎるよ。リポジトリをcloneした人はみんなローカルコピーを消さなきゃいけなくなるからね。
そうだと思うよ。
GPの考えは、commitに積極的に署名することだったと思う。
チームとか、メンバーシップとか、リポジトリへの割り当てとか、そんなの気にしなくて良くない?APIコール一発でいけるじゃん。
>認証されたユーザーは、自分が所有するリポジトリ、コラボレーターであるリポジトリ、組織を通じてアクセスできるリポジトリにアクセスする権限がある。
https://docs.github.com/en/rest/repos/repos?apiVersion=2022-…
具体的にどれくらい難しいの?例とかある?説得する側と説得される側、どっちが大変?もっとコメントを表示(2)
分散認証は、オンボーディングとオフボーディングを手動でするか、自動化する必要があるってことだよね。
さらに、SAML SSOだけじゃダメで、SCIMも実装して、リアルタイムにアイデンティティをアップデートする必要がある。これもSAMLとは別のプロトコル。
>もしアカウントロックアウトの規制要件があるなら”
ベンダーが実装すれば良いんじゃない?コントロールが必要なことが、リスクになることもあるよね。
誰かWS-*とOASIS/XACMLとかのメーリングリストと標準化団体の闇を深掘りしてくれ。もっとコメントを表示(3)
要するに、ネストされた構造に署名するのは難しくて、ミスしやすいってこと。メッセージをraw stringで包んで、そのraw stringに署名するのが簡単だよね。
[1]: https://www.latacora.com/blog/2019/07/24/how-not-to/
もしあなたがプライドのあるIT管理者なら、SAMLなんて将来の計画から外すべきだよ。SSOっていう考え方自体が怪しいし。XMLの解析は一週間で二回も問題が起きてるから、今後は避けるべき。XMLをJSONに置き換えるポリシーってどうなの?
OAuth 2.0とその拡張であるOpen ID Connectは、もう10年以上前からあるんだよね。こいつらにも独自の落とし穴(OIDCの定義が甘いID tokenとか、考えの足りないimplicit flowとかhybrid flow)があるけど、SAMLほど危険なものはないよ。
ほとんどのアプリケーションがOpen ID Connectに対応してるのに、組織が惰性でSAMLを選んでるのを見ると、もったいないなって思う。
もちろん、SAMLを使ったSSOを避けられるなら、避けるべきだよね。
{
”data”: ”XXX”,
”sig”: ”BAD”,
”sig”: ”GOOD”
}
つまり、JSONを扱うセキュリティソフトウェアは、Go, Javascript, ruby, pythonとかで書くべきじゃないってこと(ほとんどの人が重複キーを無視するJSONパーサーを使ってるから)。
haskell (aeson)とかrust (serde_json)とかjava (gson, org.json)みたいに、重複キーでエラーを出すJSONライブラリがある言語を選ぼう。
正しいパース結果は’400 bad request’だよ。
https://github.com/protocolbuffers/protobuf/blob/6aefdde9736…
これは厳密にはパーサーの問題じゃないね。
CSVもあるし。
インデックスベースの暗黙的なキーを持つバイナリプロトコルや、可変長フィールドの前にバイト長を付加するものもある。これらは最高の標準だよ(IPヘッダーとかTCPヘッダーを見て)。