Hacktron が Rocket.Chat に 24 時間体制のセキュリティを提供する方法
- 平均 1~2 分
- PR 1 件のセキュリティレビューにかかる時間
- 17 件の実際の脆弱性
- 最初の 20 日間で発見し、トリアージ
- 73%
- 発見した問題のうち、対応が必要で実際に対処したものの割合
「今ではすべての PR にセキュリティスキャンを広げられるようになりました。」
「Hacktron が潜在的な問題を指摘してくれるので、より注意が必要なプルリクエストにレビューの力を集中できます。」
Julio Araujo
セキュリティディレクター
Rocket.Chat について
Rocket.Chat は、世界中の政府、防衛、企業のチームに使われている、オープンソースで完全にカスタマイズ可能なコミュニケーションプラットフォームです。この規模のソフトウェアではセキュリティが最優先事項です。そしてセキュリティ脆弱性を最も低コストで捕捉できる場の一つが、ソフトウェア開発ライフサイクルの早い段階、つまり本番環境に到達する前の、より良い設計と継続的なコードレビューです。
課題:コードの速度とセキュリティレビューの間で広がるギャップ
とはいえ、AI 以前から、開発者とセキュリティエンジニアの人数比を考えると、すべての PR を脆弱性の観点から綿密にレビューするのは現実的ではありませんでした。AI によってコードが書かれ出荷されるスピードが加速している今、すべての変更をセキュリティの観点でレビューすることは、これまで以上に重要になっています。
「すべての PR を徹底的にレビューできるほどのエンジニアは、単純にいません。従来の SAST、SCA、シークレットスキャンのツールは非常に役立つこともあり、今も使っていますが、ビジネスロジックの脆弱性のような複雑な問題を特定するのに必要なコンテキストが欠けていることがよくあります。」
「また、複数のステップにわたって推論したり、脆弱性を連鎖させてシステムが実際にどう悪用されうるかを理解したりすることも苦手です。」
Julio Araujo
セキュリティディレクター
Hacktron ですべての PR にセキュリティレビューを拡大
このギャップを埋めるため、Rocket.Chat は Hacktron Review を使って 24 時間体制で継続的にコードとセキュリティのレビューを行い、高くつく脆弱性を本番環境に到達する前に捕捉しています。
すべての PR に対して、Hacktron は次のことを行います。
- コードの変更に対して詳細なセキュリティレビューを実行します。
- 脆弱性を PR 内で直接、わかりやすいコメントで指摘します。
- 対応が必要な問題を、開発者がマージ前に修正できるようにします。
- 優先度の低い検出結果を追跡してまとめ、定期的に修正できるようセキュリティチームを支援します。
- 定期的な監査や手作業のレビューだけに頼らず、セキュリティレビューを継続的に行えるようにします。
「Hacktron は、私たちのコードベースとフィードバックから時間をかけて学習します。」
「意図した機能、受容したリスク、セキュリティ要件についてのコンテキストを提供するほど誤検知は減り、精度が上がって、問題ではないもののトリアージに費やす時間が短くなります。」
Julio Araujo
セキュリティディレクター
ここからは、Rocket.Chat における Hacktron のレビューを分析していきます。どのような脆弱性を見つけるのか、その検出結果はどれほど正確なのか、そしてチームがより速く出荷するのにどう役立つのかです。最初の 20 日間で、Hacktron は 155 件の PR をレビューし、実際の問題を提示しました。その中には、ログインしている任意のユーザーが別のユーザーの完全なデータエクスポートをダウンロードできてしまう重大な認可バグ、導入環境全体でログインの境界を弱めていた 2 つの重大な Apple OAuth の欠陥、そしていくつかの XSS 脆弱性が含まれます。
検出結果の分析
最初の 20 日間(2026 年 6 月 5 日~25 日)、Hacktron は届いたプルリクエストをすべてレビューし、変更された 10,744 ファイルを対象に 490 回のスキャンを実行しました。以下は、レビューした PR、見つかった問題、それらのトリアージ結果、そして有効な検出結果の実際の重大度の内訳です。
すべての PR が自動的にレビューされ、一般的な PR ではレビュー自体が約 1~2 分で完了しました(中央値は 1.4 分、95 パーセンタイルでは 5.3 分)。誰の作業も遅らせることなく CI に組み込める速さです。ただし、変更の多い PR では、Hacktron が徹底的にテストするために時間をかける点に注意してください。
どのような脆弱性を見つけますか?
では、重要な問いである、どのような脆弱性を捕捉したのかを見ていきましょう。Hacktron は単なるパターンマッチャーではありません。セキュリティリサーチャーと同じようにコードを読み、推論します。そのため検出結果は、アクセス制御の不備、認証/2FA のバイパス、XSS、SSRF/オープンリダイレクト、暗号化の不備、シークレットの露出、ビジネスロジックの欠陥と、OWASP Top 10 の大部分に及びました。
Hacktron が捕捉した上位 3 つの脆弱性を詳しく見ていきましょう。
Apple OAuth を介したアカウント乗っ取り
これは、Rocket.Chat がワークフローに Hacktron を統合した直後に Hacktron が見つけた最初の脆弱性で、非常に巧妙かつ重大なバグです。
ここで重要なのは、Hacktron が PR の変更範囲の外にあるバグを見つけたという点です。その理由は、Hacktron のレビューが PR の差分だけに狭く限定されていないことにあります。Hacktron はコードベース全体の依存関係や影響をたどり、二次的な脆弱性を見つけます。
高
Apple OAuth ログインにおける未検証のメールアドレスを介したアカウント乗っ取り
apps/
loginHandler.ts の Apple OAuth ログインハンドラーには、Apple の ID トークンにメールアドレスが含まれていない場合に、クライアントが指定したメールアドレスを信頼してしまう脆弱性があります。loginRequest 内のクライアント指定の email フィールドは暗号学的に検証されていないため、攻撃者は任意のメールアドレス(例:被害者のメールアドレス)を指定できます。すると accounts_meld.js フックがこの未検証のメールアドレスを使って既存のユーザーを検索し、攻撃者の Apple サービス ID を被害者のアカウントに紐付けます。これにより、攻撃者は自分の Apple ID で被害者のアカウントにログインでき、完全なアカウント乗っ取りにつながります。
再現手順
- 攻撃者は自分の Apple ID を使って Apple ログインを開始し、Apple の
identityTokenにemailクレームが含まれないようにします(例:メールアドレスを共有していない Apple ID を使う、または Apple がメールアドレスを省略する 2 回目以降のログイン時に行う)。 - 攻撃者は、Rocket.Chat サーバーに送信されるログインリクエスト(例:DDP の
loginメソッド呼び出し)を傍受します。 - 攻撃者は
loginRequestのペイロードを改変し、emailフィールドに被害者のメールアドレスを含めます:{"identityToken": "<attacker_token>", "email": "victim@example.com", "fullName": {...}}。 - サーバーがリクエストを処理します。
loginHandler.tsではserviceData.emailが空のため、serviceData.email = email(被害者のメールアドレス)が代入されます。 accounts_meld.jsフックが被害者のメールアドレスでユーザーを検索して被害者のアカウントを見つけ、攻撃者の Apple ID をそのアカウントに紐付けます(Users.setServiceId(user._id, serviceName, serviceData.id))。- 攻撃者は被害者のアカウントにログインした状態になり、自分の Apple ID を使っていつでもアクセスできるようになります。
apps/meteor/app/apple/server/loginHandler.ts では、Apple JWT にメールアドレスが含まれていない場合、Apple Sign-In のフローがクライアント指定のメールアドレスにフォールバックしていました。
const serviceData = await handleIdentityToken(identityToken);if (!serviceData.email && email) { serviceData.email = email; // attacker-controlled fallback}攻撃者はメールアドレスのクレームを含まない Apple JWT を偽造し、リクエストに任意の email を指定することで、任意のユーザーとして認証できました。この脆弱性は既存のコードに存在していたため、Rocket.Chat はこれを重大度「重大」のアドバイザリ(GHSA-wx3c-76rf-wpwf、CVE-
Apple サインインで JWT クレームの検証が省略されていた
同じハンドラーには、別のバグもありました。JWT の署名は検証していたものの、クレームの検証を省略していたのです。JWS.verifyJWT ではなく JWS.verify(署名のみ)を使っており、aud、exp、nbf を一切確認していませんでした。空でない iss を持つ Apple 署名のトークンであればどれでも受け入れられたため、漏洩したトークンや別のオーディエンス向けのトークンを再利用して被害者としてログインでき、その再利用期間に有効期限はありませんでした。Rocket.Chat はこれを重大度「高」のアドバイザリ(GHSA-c75c-5hc7-j4vp、CVE-
重大
Apple の ID トークンハンドラーで JWT のオーディエンス(aud)が検証されず、アカウント乗っ取りにつながる
apps/meteor/app/apple/lib/handlePassportIdentityToken.ts の handlePassportIdentityToken 関数は、Passport.js ベースの Apple Sign-In フロー(apps/meteor/app/apple/server/applePassportOAuth.ts)で Apple の ID トークンを解析し、検証する役割を担っています。トークンの暗号署名、発行者(iss)、有効期限(exp)は正しく検証していますが、オーディエンス(aud)クレームを検証していません。
OpenID Connect のような JWT ベースの認証フローでは、aud クレームはトークンの想定受信者(クライアント ID)を示します。aud が Rocket.Chat インスタンスに設定された Apple のクライアント ID と一致することを検証しなければ、アプリケーションは有効な Apple の ID トークンであれば何でも受け入れてしまいます。
攻撃者は、「Sign in with Apple」を有効にした独自のアプリケーションを作成することで、これを悪用できます。被害者が攻撃者のアプリケーションにログインすると、攻撃者はその被害者の有効な Apple の ID トークンを受け取ります。攻撃者は、このトークンを Rocket.Chat サーバーの Apple OAuth コールバックエンドポイントに送信できます。トークンは本物の Apple の署名を持ち、発行者も有効で、有効期限も切れていないため、handlePassportIdentityToken は被害者のデータを返します。続いて上流の Passport ストラテジー(applePassportOAuth.ts 内の AppleStrategy)がこのデータを使って攻撃者を被害者としてログインさせ、完全なアカウント乗っ取りにつながります。
なお、apps/meteor/app/apple/lib/handleIdentityToken.ts にある別の関数 handleIdentityToken はオーディエンスの検証を正しく実装していますが、handlePassportIdentityToken ではそれが完全に欠落しています。
任意のユーザーが別のユーザーのデータエクスポートをダウンロードできた
GDPR のデータエクスポートのダウンロード経路では、アクセスチェックがファイルオブジェクトなしで呼び出されていたため、フェイルオープンとなってログインしている任意のユーザーを許可していました。有効なエクスポートファイル ID があれば、攻撃者は別のユーザーの完全なデータエクスポート(プライベートメッセージ、プロフィール、ルームのデータ)を取得できました。PR #40889 で検出され、マージ前に修正されました。
重大
UserDataFiles におけるオブジェクトレベル認可の不備(BOLA)により、認証済みの任意のユーザーが GDPR データエクスポートをダウンロードできる
apps/
Rocket.Chat のファイルアップロードのアクセス制御の仕組みに、認可バイパスの脆弱性が存在します。ユーザーが UserDataFiles コレクション(プライベートメッセージ、ダイレクトメッセージ、個人データを含む、ユーザーの非常に機密性の高い GDPR データエクスポートを格納)からファイルのダウンロードを要求した際、サーバーは要求したユーザーがそのデータエクスポートの所有者であるかどうかを検証していません。
結果:より強固なセキュリティ体制と、問題ではないもののトリアージに費やす時間の削減
Rocket.Chat にとって最大の成果は、少ない人員で大きな効果を引き出せることです。Hacktron によってセキュリティチームは、セキュリティをエンジニアリングのスピードの妨げにすることなく、開発ワークフロー全体に専門家によるレビューを一貫して適用できるようになりました。
その結果、エンジニアリングとセキュリティの間のフィードバックループが緊密になりました。脆弱性はより早い段階で捕捉され、開発者は変更の時点でより明確なガイダンスを得られ、セキュリティチームはノイズの選別に費やす時間を減らして、本当に重要な問題により多くの時間を使えるようになっています。