エンジニアが語るMicrosoft Azure, mac OS, GitHub, LINEの脆弱性の見つけ方
スピーカーのご紹介
寺村 亮一
博士号取得後、大手コンサルティングファームにてサイバーセキュリティ業務に従事し、大手自動車部品メーカーとのサイバーセキュリティ合弁会社設立などを主導。2020年より現職。その他、CRYPTREC 暗号活用委員など幅広く活動。CISSP / GXPN / 博士(工学)
サイフィエフ ルスラン
ロシアでシステム管理者/セキュリティエンジニアとして経験を積んだ後、日本でWebアプリケーション、ネットワーク、API、自動車の脆弱性診断に従事。ペネトレーションテストやレッドチーム演習、脆弱性診断ツールの開発・検証を担当。OSEE、OSCP、GXPNなどの資格を持ち、CTFで受賞実績多数。
小池 悠生
2020年、サイバーセキュリティのスタートアップ創業メンバー。2023年GMOイエラエ サイバーセキュリティ事業本部執行役員に就任。ファジングを中心としたサイバーセキュリティに関する研究、コンサルティング、ペネトレーションテストなどを担当。日本を代表するCTFチームbinjaのキャプテンとして国際CTFで受賞実績多数。CODE BLUE 2015 U25スピーカー
山崎 啓太郎
2018年、大手IT企業でのセキュリティリスクアセスメント業務を経て、2020年から現職。主にWeb関連の高度な診断、ペネトレーションテストを担当。学生の頃より10年以上CTFで遊んでおり受賞実績多数。現在もCTFで得た知識を業務に役立てている。業務中やCTF中にゼロデイを見つけることも。
川田 柾浩
2020年から現職でペネトレーションテスト業務に従事。レッドチーム案件を中心に担当し、ツール開発や研究・調査も行っている。レッドチーム案件の中ではMac環境やゼロトラスト環境の調査以外にもOSINT調査やフィッシング・ソーシャルエンジニアリングを担うことが多い。
(本レポートは2023年12月に開催されたGMOサイバーセキュリティカンファレンス IERAE DAYS 2023の講演「イエラエの日常2023」のトークセッションから一部内容を切り出したものです)
寺村:まず私の自己紹介ですが、サイバーセキュリティ事業本部長としてサイバーセキュリティ事業を統括している寺村と言います。
GMOイエラエにはホワイトハッカー…というよりもセキュリィオタクと呼んだ方がしっくりくるような、セキュリティに対して強い興味関心を持っている優秀な技術者がたくさんいます。
普段から技術書を読むのが好きな人や、プライベートでも製品などに脆弱性がないか調べる人、個人でCTFやバグバウンティに参加しているような人がいて、そんな人たちが集まることでGMOイエラエ特有の「文化」が形成されています。
このセッションではGMOイエラエのエンジニアが2023年に出した成果を皆様に共有したいと思います。では最初にルスランさん、よろしくお願いします。
Microsoft Azureの脆弱性の見つけ方
ルスラン:よろしくお願いします。オフェンシブセキュリティ部の部長をしています、ルスランと申します。私のエンジニアとしてのキャリアは10年ほどで、ペネトレーションテスト以外にもWebアプリケーションの診断から車載電子機器の脆弱性診断まで「なんでも屋さん」のように幅広く対応してきました。以前からCTFに積極的に参加していて、また知識の幅を広げるためにセキュリティに関する資格取得の勉強も継続的に行っています。CVEを報告するようになったのは今から2~3年前です。
今日ご紹介するのは「AzureのWebAppにおけるSandbox Escape (CVE-2023-21777)」というものです。Azure WebAppを簡単に説明すると複数のプログラミング言語に対応したアプリ開発プラットフォームで、Webアプリケーションサーバでいうところのホストから実行基盤(ランタイム)までをマネージドサービスとして提供しているものです。ちなみに調査期間は1ヶ月ほどで、この脆弱性以外にも2件脆弱性を見つけています。
WebAppはマルチテナントで1つの物理ホスト上に複数のWebAppがデプロイされます。色んなテナントが共通の端末を使うという特性において、もし端末が乗っ取られてしまったら何が起こるかを調査しました。
注目したのはOpenThread(※1)というWindows APIで、Thread IDに対しブルートフォース攻撃を試したところ「あれ、Handleが色々開けるな」と気が付きまして、調べていくと、自分以外のユーザの名前が出ているのを見つけたんです。これをさらに詳しく調べると、本来アクセスできないはずのプロセスのスレッドにアクセスできること、さらにはTHRAD_FULL_ACCESS権限によって対象プロセスや実行中アカウントが不明なスレッドのHandle取得が可能なことを確認しました。
スレッドのHandleが取得できると、以下のWindows APIによって様々な操作が可能になります。
・NtQueryInfomationThread(情報収集)
・QueueUserAPC(インジェクション)
・SetThreadContext(インジェクション)
・SuspendThread/ResumeThread(一時停止/開始)
やり方次第ではExploitを仕込んで別のテナントに侵入することもできる、非常に危険度が高い脆弱性でした。
(※1)OpenThread関数の説明はこちら:https://learn.microsoft.com/ja-jp/windows/win32/api/processthreadsapi/nf-processthreadsapi-openthread
ルスラン:次に私たちのチームが普段ペネトレーションテストでどんなことをしているかも、少しだけ紹介します。実は私たちが見つけたゼロディの脆弱性のほとんどは、ペネトレーションテスト中に見つけています。
攻撃対象であるお客様の端末は通常、EDRなどで監視されています。私たちペンテスターとしては「攻撃者」という立場で見た時、この端末がアクセスできる領域が知りたい。特にVPNの接続情報やゼロトラスト的なもの(Zscaler、Netskopeなど)のセッションが欲しいんですね。
これらのセッションをお客様管理下の端末から(私たちの手元にある)お客様管理外の端末へ移せれば、EDRも何も入っていない環境から内部NWへ通信を可能にできます。このようにして、セキュリティ機器に検知されないようにテストを進めます。
その後はソフトウェアの調査として、既知の脆弱性がないか探したり、実行中のソフトウェアを解析したりします。もし何らかのソフトウェアにゼロディの脆弱性を見つけた場合は、そこから横展開をするためにPoCを書いてさらに検証します。
テスト中に見つかったゼロディの脆弱性は、ベンダーに直接報告するか、IPAやJPCERTなどに報告します。ベンダーにて脆弱性が修正されたら、速やかにお客様にパッチの適応をお願いする、というのがきれいな終わり方ですね。
Apple macOSの脆弱性の見つけ方
寺村:ルスランさん、ありがとうございます。続いてもオフェンシブセキュリティ部からの発表で、川田さん宜しくお願いします。
川田:宜しくお願い致します。オフェンシブセキュリティ部の川田です。普段はペネトレーションテストやレッドチーム案件を担当しています。
私が発見したのはApple社のmac OSにおける脆弱性です。「.terminalファイルをLogin Itemsに追加することで、macOSにおける任意のアプリケーションのサンドボックスからエスケープできる脆弱性(CVE-2023-27966)」というものですが、今日ご来場いただいている方にとって聞いたことがない単語も多いと思いますのでひとつずつ解説していきます。
GMOイエラエのペネトレーションテストでは疑似的なマルウェア(C2エージェント)を作成し、そのマルウェアを実行いただくことで当社内に設置しているテスト用のC2サーバと接続し、そこから内部ネットワークにアクセスするという方法を取っています。
Windows環境ではWordドキュメント形式(.docx)のC2エージェントを利用するのに対し、Mac環境ではアプリケーション形式のC2エージェントを利用していました。そこでMacでもWindowsでも有効なC2エージェントを開発できないかな、と思って調査していました。
macOSではWordアプリケーションにはサンドボックスが適用されています。そのままでもC2セション繋いで遠隔操作を行うこと自体は可能ですが、攻撃者としてより広範囲に活動するにはサンドボックスから脱出する(※サンドボックスエスケープ)必要があります。
そもそもアプリケーションサンドボックスとは何かというと、macOSで提供されている、アプリケーションのアクセス制御技術です。アプリケーションが危険にさらされた場合にシステムやユーザのデータへの被害を抑制するように設計されています。
今回見つけた脆弱性においてキーとなった「Login Items」についても説明します。
これ自体はとてもシンプルでユーザのログイン時に自動で開かれるアプリケーションやファイルのことを指します。Login Itemsを経由することでサンドボックス環境の外からアプリやファイルを開くことができるため、サンドボックスエスケープにおいてはとても大きなポイントとなります。
私の見つけた脆弱性には実は元となったある手法があります。2020年にMadhav Bhatt氏によって公開された、Wordアプリケーションのみで有効(発表当時)なサンドボックスエスケープの手法です。
参考:https://desi-jarvis.medium.com/office365-macos-sandbox-escape-fcce4fa4123c
一般的にはサンドボックスが適用されているアプリケーションからは様々なフォルダへのファイル書き込みが一切できないようになっているのですが、Wordアプリケーションはサンドボックスのプロファイルが特殊で、特定のセット語を含むファイル名であればある程度ファイルの書き込みが行える仕様です。
Madhav Bhatt氏の攻撃手法の流れとしては下記になります。
- ユーザのホームディレクトリにzipファイル(exploit.zip)を追加
- zipファイルとterminalアプリケーションをLogin Itemsに追加
Login Itemsに追加すると、ユーザのログイン時にzipファイルが勝手に展開されます。なおzipファイルは「.zshenv」というファイル名で展開されるよう細工をしています。ユーザのホームディレクトリ直下に「.zshenv」というファイルが存在していれば、その中に記載されているOSコマンドが実行され、terminalアプリケーションが起動します。terminalアプリケーションにはサンドボックスは適用されていませんので、サンドボックスエスケープ成功です。
しかし、この手法にはzipファイルが展開される前にterminalアプリケーションが起動してしまうなど、不安定な点がありました。
そのためもっと良い方法はないか調査をしていたところで目を付けたのがmacOS上の特別なファイルである「. terminal」というXML形式のファイルで「terminal設定ファイル」とも呼ばれています。. terminalではterminalアプリケーションで実行してほしいコマンドを指定することができます。
攻撃の成功手順は以下の通りです。
- Wordアプリケーションから.terminalファイルをコンテナディレクトリにアップロード
- Login Itemsにアップロードした.terminalファイルを追加して、強制再ログイン
これによりサンドボックスから脱出し、攻撃者は比較的自由に活動できます。元となった手法に比べるとユーザのホームディレクトリに書き込む必要がなく、.terminalファイルをコンテナディレクトリにアップロードさえすれば任意のアプリケーションのサンドボックスからエスケープすることが可能です。
この脆弱性を見つけたことにApple社からは高く評価をいただいて$10,000以上の報奨金をいただきました。
GitHubの脆弱性の見つけ方
寺村:川田さん、ありがとうございます。続いてはWebに対するペネトレーションテストの領域での発表です。山崎さん、宜しくお願い致します。
山崎:アプリケーションセキュリィ課の山崎です。Webアプリケーションのペネトレーションテストを担当しています。元々はWebアプリケーションを作る側だったのですが、CTFに参加したことをきっかけにセキュリィの方に興味を持ちました。CVEもこれまでにいくつか見つけていて報告しています。
本日はGitHubのDependabotとnpmの脆弱性を組み合わせることで、GitHubの内部サーバに侵入することができた事例をご紹介します。
DependabotとはGitHub がホストしているボットで、セキュリティアップデートプログラムを使用してプルリクエストを発行することで、脆弱性のある依存関係を自動で修正してくれる機能です。この機能に注目したのは、Dependabotを乗っ取れると任意のリポジトリにプルリクエストを送れる、書き込みをできるのではないかと思ったからです。
先に結果だけお伝えすると、DependabotにはURIの検証不備という脆弱性があり、それに加えてnpmには任意コード実行の脆弱性がありました。これらを利用してDependabot の内部サーバに侵入し、GitHubの内部のAPIのサーバにアクセスしたり、Dependabot自体の非公開のソースコードを閲覧したりすることができることを確認しました。
URIの検証不備
Dependabot のURIの検証不備の脆弱性がどういったものかというと、Dependabotの中にいくつかパッケージのURLを検証するコードがあります。スライドの<検証コード1><検証コード2>をご覧ください。
URLの検証を突破すると、Dependabotのサーバ上で「npm install … <URI> --ignore-scripts --package-lock-only」というコマンドが実行されます。
npmはJavaScriptやNode.jsで使われるパッケージシステム、コマンドラインツールですが、npmのパッケージをインストールする時にこの--ignore-scriptsを指定しないと、悪意のあるパッケージをインストールしてしまった場合に、そのパッケージ内のスクリプトが実行され端末がマルウェアに感染するなどの恐れがあります。そういったことを防止するためのオプションで、これが有効になっているためnpm installを実行するだけでは任意コード実行は発生しないはずでした。
npmの脆弱性: GHSA-hxwm-x553-x359
npm installを実行した時に‘git+https://’から始まるURLが挿入されていると、
「child_process.spawn('git', ['ls-remote', 'git+https://…'], { shell: true })」というコードが呼び出されますが、ご注目いただきたいのは「shell: true」の部分で、これがあると引数の所に;(セミコロン)などの文字を入れることで、シェル上で別のコマンドとして解釈され実行されてしまうというバグがありました。
例文ですと、「;sl;」という文字列を追加するとアスキーアートのSLが走ることが確認できました。
この二つの脆弱性が組み合わさると、細工したpackage.jsonファイルをリポジトリに配置し、DependabotをONにして実行するとDependabotの内部サーバ上でコマンドを実行することができました。これにより内部のサーバからDependabotになりすましたり、一般公開されていないGitHub専用のAPIを実行したりと、本来できない操作が可能になります。
なおDependabotに限らず、--ignore-scripts を指定して、安全にパッケージ情報の取得を行うシステムで同様の攻撃ができる可能性もあります。
この脆弱性はGitHubに報告し現在では修正されています。報奨金は$8,000くらいだったかと思います。
LINEの脆弱性の見つけ方
寺村:山崎さんありがとうございます。続いて小池さん宜しくお願い致します。
小池:宜しくお願い致します。サイバーセキュリティ事業本部で執行役員をやっています。学生時代からCTFやCODE BLUEでの登壇など、セキュリィに関する活動を行っていまして、今日紹介するのは少し古いものですが、過去に見つけた「LINE (Android版)」における複数の整数オーバーフローの脆弱性(CVE-2019-6010)の脆弱性をご紹介します。
LINEはOSSのライブラリやソフトウェアをいろいろ公開しているのですが、それらを見ていた時にAPNG(Animated PNG)という画像ファイル形式、GIFのようにPNG上で動画のようなものを作れるファイル形式なのですが、そのデコーダーにこの脆弱性を見つけました。
こちらは実際のコードです。やっていることはすごく単純で、ファイルの画像サイズがどれぐらいかを読み込みます。読み込んだらその分のメモリが必要なので、ファイルの中身を読むメモリを確保します。
重要なのは以下の一行です。縦と横の長さを掛けて、どれくらいのメモリが必要なのか計算をしています。
size_t size = height * row_bytes;
プログラミング勉強されたことがある方ならご存知かと思いますが、「固定長整数型」というもので、プログラミングではメモリを確保して、メモリにデータを書き込んで何らかの処理をするというのが基本ですが、数値もメモリの中に押し込まないといけないわけですね。
プロラミング言語によってはこの整数値を扱うために使うメモリが固定の長さになっていて、場合によっては取得演算や計算結果がメモリに収まりきらないことがあります。
その場合、たいていのプログラミング言語ではどう処理されるかというと、結果を無視するんですね。割った余りをそのまま入れて、超えた分は無視しちゃうということが起きます。
図を見ていただくと、16進数でも10進数でも、このような値を掛け算すると明らかに2バイト分のメモリしかとっていない状態なのに、計算結果は4バイトぐらいなのでオーバーフローしてしまいます。
先ほどの掛け算の結果はメモリの確保に使われていました。その必要なメモリ数を計算するときに使われているのですが、このオーバーフローにより、本来より小さい値になってしまう。
するとどうなるかというと、メモリを確保していないにもかかわらず、書き込み自体は行おうとするので整数値オーバーフローから結果的にバッファオーバーフロー(メモリの破壊)まで起きてしまいます。
メモリが破壊されるとどうなるのか、なかなかわかりにくいかもしれませんが、基本的にはメモリが破壊されるとセキュリティ上とてもまずいです。例えば関数ポインターなど、プログラムの制御に関するデータが破壊されてしまうと、攻撃者が任意の行動実行できてしまう恐れがあります。
Android版のLINEアプリにはJavaのランタイムがあります。Javaのランタイムは非常に巨大かつ関数ポインターが多数存在するのでほぼ間違いなく関数ポインターと破壊できます。結果として理論上、任意のコード実行がリモートからできてしまうという問題でした。脆弱性の紹介は以上です。
寺村:非常にわかりやすくてよかったです。小池さん、ありがとうございます。
エンジニアが思うサイバーセキュリティの課題と対策
(本レポートは2023年12月に開催されたGMOサイバーセキュリティカンファレンス IERAE DAYS 2023の講演「イエラエの日常2023」のディスカッションセッションから一部内容を切り出したものです)
寺村:ここからはディスカッション形式で皆さまから頂いた質問にお答えしたいと思います。
Q.1技術者の人材育成、キャリアパスやモチベーションに関して、 イエラエの中で気に入っている面や今後の課題と感じている面があれば教えてください。
川田:気に入っている点としてはやっぱり周りがずっと勉強し続けているというか、ずっと技術研磨を続けている環境なので、「ひとりぼっちじゃない」と思えるのが大きいです。例えばリバースエンジニアリングについて勉強したいなと思えば、世界トップクラスでリバースエンジニアリングができる人がすぐそこにいたりするので、そんな人たちに教えてもらえること、特に物理的にそばでどんな作業をしているのか見せてもらえる環境なので、そういったところはすごく感謝しています。
課題というと…私は特に感じていないですね。
山崎:技術的に優れた人がいて、自分が知らないことも学びやすいところは私も気に入っています。課題としては、セキュリティ企業ならではですが、自分のチーム以外の案件状況は見られないというか、当然案件に関わる人しか見てはいけない制限があるので何か技術的に面白いことをやっていてもお互いに知るのが難しいですよね。技術的に興味深いことは、社内の勉強会などでできる範囲で共有していけたらなと思います。
寺村:ルスランさんは何かありますか?
ルスラン:メンバーをどう育てていくかは課題に思っています。例えば今Webアプリケーションの脆弱性診断を担当している人が、将来的にはペネトレーションテストをやりたい、IoTの解析をやりたいという人もいるので、一つの分野に限定せず自由にキャリアパスを描けるような体制を作っていきたいと思っています。
寺村:案件上の制限やリモートワークで隣の人が何をしているのかわかりにくくなっている中で、「面白そうなことやっているぞ」と思ってもらう工夫は必要ですよね。これまでも社内勉強会などの取り組みはしてきましたが、まだまだ足りないと思っていて、そこは一つの課題かもしれませんね。
Q.2初心者がCTFの力を伸ばすために、どんなアドバイスをしますか?
川田:私もCTFは最近始めたばかりなのですが「折れないこと」が大事だと思っています。無理して燃え尽きて挫折するのは嫌なので、少しずつレベルを上げるようにしています。
山崎:個人的には友達作るのが大事かなと思いますね。
小池:楽しむことは重要ですよね。挫折しないためにプライドは捨てて、わからなければ解説を見るのも全然いいと思います。
ルスラン:解説を見て、解説の通りに手を動かしてみるのも大事ですね。見るだけではなく体験として覚えていくのが上達の近道だと思います。
Q.3一般の事業会社ではイエラエさんのように尖った技術者の育成は困難ですが、貴社からみて、一般の事業会社でもこのレベルには達していた方が良いというレベルはありますか?このくらいの資格を取ってて欲しい、こんな会話には付いてきてほしいなど。
ルスラン:まず体制が必要だと思っています。「自分の会社を守りたい」という気持ちを持っている人がマネージャとして存在していること。そういう方がいればある程度リードしてくれるので、技術者を採用すること、内部のエンジニアを育てることは、私たちも支援ができますし、そんなに難しい話ではないと思います。道筋を立てて、こういう計画で進めていくという方針が固まったら育てていけば良い。あとはメンバーのモチベーションを向上させるためにも、ちゃんと評価することも重要ですね。
Q.4OSCP取得のためにまず初めに取り組んだ方が良いことがあれば教えていただきたいです。(自己学習として)
川田:私は最初本当に何もできなかったので、Hack The Boxのマシンで回答なぞって、ポートスキャンからサービスを見つけて、こんな感じで侵入していくというイメージを掴んで、あとはOSCPのラボ環境でひたすら問題を解いていました。
ルスラン:私がOSCPを取得したのは10年前で、その頃は本当に情報がなくてとにかく「やる」しかなかったんです。1ヶ月使ってラボを100%クリアして試験に臨みました。その当時に比べれば、今は情報が豊かなので色々調べてみて、挑戦してみてください。
Q.5もらったら報奨金はなにに使うのですか?
川田:私は椅子をいいオフィスチェアに変えたりデスク周りの機器を充実させました。
山崎:今回お話した脆弱性とは別件なのですが、大学のサークルの友人が「なにかおかしくない?」と言ったことをきっかけに、調べて見つけた脆弱性がありました。その際にもらった報奨金では、その子に高い焼き肉を奢りました。
小池:私もだいたい焼き肉とかで消えますね。
ルスラン:私はとくに何も買ってないかなぁ…
寺村:基本的に報奨金貰ったら焼き肉なんでしょうね(笑)
Q.7生成型AIを応用したセキュリティサービスの進化によって、企業のセキュリティ対策はこれからセキュリティ専門会社のサービス(例えばペンテスト)を使わなくても対応できるようになると思いますか?何故そう考えているかも教えてください。
寺村:そうなる可能性は全然ありえますよね。ただ、もしそんな未来があるならそれはGMOイエラエによるサービスであって欲しいと思っています。
ルスラン:現時点でも、生成AIは、フィッシングのテンプレート作成などには使えそうですよね。
山崎:日頃からいろんなWebアプリケーションを見るんですけど、言語やツールがバラバラなので「この言語ではどういう書き方をするのか」とか、ツールの使い方を生成AIに聞くことはありますね。
寺村:最後にご挨拶となりますが、皆さんのご愛顧があったからこそこのイベントが開催できました。これからもたくさんの脆弱性を見つけて、大会でも優秀な成績を収めて、社会にどんどん還元していけたらと思っています。今後ともどうぞよろしくお願いします。ありがとうございました。