自己紹介
みなさん、こんにちは。早稲田大学大学院修士1年の河岡諒です。日頃は情報セキュリティ分野で主にドメイン名の登録実態調査やドローンに関するセキュリティの研究をしています。
今回は、(10月ですが..)夏季インターンシップとして、LINEのプロダクトセキュリティ室のアプリケーションセキュリティチームに所属して1ヶ月ほど就業させていただきました。このブログでは、1ヶ月の間自分が経験したことや感じたことを紹介できればと思います。
ASTについて
まず、自分が所属したアプリケーションセキュリティチーム (AST) について、簡単に業務内容を紹介します。
業務1. RA
ASTでは、基本的にLINEの中で提供されるサービスのリスクアセスメント (RA) を実施しています。
開発者の方が作成したアプリケーションに対して、脆弱性診断を実施したり、意図しない情報を抜き出すことができるか確認することを行っています。
業務2. バグバウンティへの対応
LINEでは、hackerone.comなどを利用した「LINE Security Bug Bounty Program」を運営しています。報告のあった脆弱性について、その影響度を判断し対策や対応も行なっています。
業務3. セキュリティコンサルティング
時折、新規のプロジェクトに対してどのようなセキュリティ設計が必要かや連携する外部サービスについてのセキュリティ評価等も業務として行なっているようです。
業務4. 効率的な脆弱性発見のためのシステム開発
アプリケーション内の脆弱性を効率的に発見するためのシステム開発も行っています。
既知の脆弱性やデバッグ用エンドポイントが開いていないか等、機械的に検知できる部分を見つけるためのプログラムが作られていました。また、RAや脆弱性の情報等を一元的に管理するためのSIMS(Security Issue Management Service)の開発・導入も行っていました。
業務5. その他
コードレビュー : 開発の過程やOSSとしての公開前にコード中に脆弱性が含まれていないかについてコードレビューを行うこともあります。
DFIR : インシデントが発生した際に、CSIRTチームなど他のチームと協業して、特にアプリケーションレイヤーでの技術的な支援や調査を行うこともあるようです。
成果: サプライチェーン攻撃の検知
ここから、インターン期間中に作成したサプライチェーン攻撃検知プログラムについて説明します。
背景
近年、ソフトウェアのサプライチェーン攻撃が増えており、新たな脅威となっています。
ソフトウェアのサプライチェーン攻撃とは
そもそもソフトウェアのサプライチェーンとは、ソフトウェアの企画から開発・運用・保守までの一連の流れのことを指します。ソフトウェアのサプライチェーン攻撃では、そのサプライチェーンへ攻撃をすることで関連する企業やサービスに影響を与える攻撃です。
ソフトウェアサプライチェーンへの攻撃にもさまざまな種類があり、下記などが挙げられます。
- オープンソースコードの侵害
- アップデートのハイジャック
- コード署名の弱体化
今回は、この中でも特にアップデートのハイジャックに注目をします。
アップデートがハイジャックされることで、今まで利用していたソフトウェアがアップデートされた途端に悪性なソフトウェアが仕込まれてしまう、なんてことが発生します。また、ハイジャック対象がライブラリとして広く利用されていた場合、そのライブラリを利用して開発されたソフトウェアも影響を受けることとなり、さらに被害が深刻となります。
参考文献: Defending Against Software Supply Chain Attacks, NIST
事例
具体的に、ソフトウェアサプライチェーン攻撃の被害事例をいくつか紹介します。
Solarwinds Orionに対するサプライチェーン攻撃 [1][2]
これは、2020年12月にSolarwinds社の提供するOrion Platformのアップデートにバックドア型のマルウェアが仕込まれていたことが判明した事件です。
このプラットフォームはIT監視・管理ソフトウェアであり、多くの企業や政府機関により利用されていました。バックドアが仕込まれていたことにより、攻撃者により多くの被害者にアクセスが可能となっていました。
参考文献 1: SolarWinds 社製 SolarWinds Orion Platform ソフトウェアのアップデートについて, JPCERT/CC
参考文献 2: SolarWindsのサプライチェーン攻撃についてまとめてみた, piyokango
UAParser.js のハイジャック [3][4]
これは、2021年10月22日にnpmにて公開されているUAParser.jsというライブラリがハイジャックされたという事件です。
UAParser.jsはユーザーエージェントを判断するためのJavaScriptのライブラリとなっており、ITの大手企業を含む1000以上のプロジェクトで利用されています。このライブラリの開発者のnpmアカウントが乗っ取りの被害に遭い、悪意のあるコードが含まれたバージョンが公開されました。機密情報の盗難や暗号資産のマイニングの被害があるそうです。
参考文献 3: Security issue: compromised npm packages of ua-parser-js (0.7.29, 0.8.0, 1.0.0), github
参考文献 4: Popular NPM library hijacked to install password-stealers, miners, bleepingcomputer.com
Codecovへのインシデント発生によるCIパイプラインの侵害 [5]
これは、2021年の2月ごろにCIパイプラインのサービスを提供するCodecov社に対して発生したインシデントで4月1日に検知されました。
この攻撃の影響で、CIパイプライン中で用いられるスクリプトファイルが書き換えられ、攻撃者がこのサービスの利用者の機密情報を盗み出したという事件です。実際にサービスを利用していた企業に情報流出等の影響が出ています [6]
参考文献 5: Bash Uploader Security Update, codecov
参考文献 6: 「Codecov」への第三者からの不正アクセスによる当社への影響および一部顧客情報等の流出について, mercari
また、ソフトウェアサプライチェーンに対する攻撃だけでなく、研究やバグバウンティも盛んに行われています。
このように、ソフトウェアのサプライチェーンに対する攻撃は増加しており、改めて脅威となっています。
プログラムの作成
今回は、LINEのウェブサービスが依存する外部リソース (css, script等) を監視対象とし、これらに変更があった場合に迅速に対応できる体制の構築を目的としました。
データ収集と差分検出の2つに分けてプログラムの作成を行い、具体的には、以下の図のような流れで情報収集を行いました。
データの収集
- データの収集では、LINEの管理するドメイン名・サブドメイン名に対して行います。
- 初めに、一つのドメイン名をクローリング対象を保持するキューに入れます。
- 次に、httpsを用いてアクセスを行います。
- その時のブラウザの通信から読み込まれたスクリプトやファイルを抽出し、sha256でハッシュ値を算出した上で記録します。
- また、取得されたhtmlより、aタグを抽出し、そのリンク先をクローリング対象を保持するキューに追加します。
- このキューが空になるまで収集を継続するというシンプルな作りです。
- ここで、効率化のため、ひとまずは深さが2となるまで探索することとし、LINEの管理するドメイン名・サブドメイン名以外へのリンクはクローリング対象としないこととしました。
- 収集情報は以下のようにデータベースに格納しました
DB-schema
DB
├── エントリーポイントのURL
│ ├── .
│ │ ├── 日付
│ │ ├── コンテンツのURL
│ │ ├── ハッシュ値
│ │ ├── コンテンツタイプ
│ │ ├── 同一ドメインか
│ │ ├── アクセスしたURL
│ │ ├── エントリーポイントからの深さ
│ │ └── アクセス日時
│ └── .
│ ├── 日付
│ ├── コンテンツのURL
│ ├── ハッシュ値
│ ├── コンテンツタイプ
│ ├── 同一ドメインか
│ ├── アクセスしたURL
│ ├── エントリーポイントからの深さ
│ └── アクセス日時
└── エントリーポイントのURL
└── .
├── 日付
├── コンテンツのURL
├── ハッシュ値
├── コンテンツタイプ
├── 同一ドメインか
├── アクセスしたURL
├── エントリーポイントからの深さ
└── アクセス日時
差分検出
収集したデータをもとに、コンテンツのsha256に差分があるかどうかを確認します。
今回は、データベースとしてMongoDBを利用しましたが、以下のクエリで確認することができます。
db.collection.aggregate([{$group: {
_id: "$link",
hashes: {
$addToSet: "$sha256"
}
}}, {$addFields: {
count: {$size: "$hashes"}
}}, {$match: {
count: {$gt: 1}
}}])
ここで、差分が生じていた場合は、slackに通知する機能も追加しました。
収集情報の紹介
どんなデータが収集できたかについて簡単に紹介します。
収集したデータは以下のようなものとなっています。
また、差分検出の結果は以下のようになっています。いくつか検出されているものがありますが、広告系のものばかりで識別のために読み込みごとに別のidを振っていることが原因として考えられます。
改善点
- ページを辿る際に、aタグを利用していましたがその他のリンク方法へも拡張したいと思います。
- エントリーポイントから効率性の観点で深さ2までに絞りましたが、より深いものへの対応も行いたいです。
- 外部スクリプトで特にアナリティクス系のものはアクセスごとにidが振られるためか、ハッシュが異なってしまうことへの対策を考えたいです。
- また、ウェブサイトによる読み込みを考えましたが、npmやpipなどのpackage managerやCI/CD pipelineなどにも調査対象を拡大したいです。
インターン内容の話
ここでは、自分がインターン期間中にどんなことをやっていたのかを紹介したいと思います。
1週目
初めは、Androidのアプリに関するRAを行いました。アセスメント用のAndroidとiOSの端末が手元になかったので、Emulator上で行いました。通信をモニタリングしたり調査を行うためにエミュレータのroot化を行いましたが、いくつかコツがいる部分もあり何度か失敗してやり直したりしてました。仕様書やコード・アプリの通信内容を見て脆弱なポイントがないかを見ていきました。
2週目
AndroidとiOSの端末が手元に届いたので、そのセットアップを行いました。EmulatorはPC上で実行するので通信のキャプチャは比較的容易でしたが、端末を用いた場合はPC経由で通信を行う必要がありセットアップに少し時間がかかりました。この週は具体的に何かのRAをやるというよりは、LINEのアプリのベータ版などをそれぞれの端末にインストールし、挙動やどんな通信が行われているのかを見ていました。
また、バグバウンティの過去事例やRAの過去事例を遡ってみていくことも行い、特にバグバウンティについては、なんでこんなの気づくんだ..みたいなものも多くありました。 (脆弱性への対応は多くのバグハンターの方にも支えられているんだなと思いました。)
3週目
この辺りからウェブアプリも見始めました。近日中にローンチされるあるウェブアプリについてRAを実施しました。データの受け渡し等があるときに、渡す側でどうなってるのかや受け取る側でどうなっているのか、また、データの処理がどうなっているかについてみていきました。
いくつか脆弱性か?と思われるものを発見はしたものの、ベータ版とリリース版で異なる挙動をするように設計がなされていたりで違っていました..
2週目の終盤頃からこのブログで何を書こうかと考え始めましたが、RAを実施させていただいてはいるものの特に何の発見もできておらず全然貢献できてないなぁと感じていたので何か有用なツールを開発できればと思いました。
4週目
いくつか作るものの案は考えていましたが、ちょうどnpmパッケージのハイジャックの件があり、外部スクリプトやパッケージに起因するサプライチェーン攻撃が脅威であると考え、上で説明を行ったツールを作成することにしました。
終わりに
まとめ
- ソフトウェアサプライチェーン攻撃をハッシュ値の変化をモニタリングすることで検出するプログラムを作成しました。
- 今回のインターンシップとしては、セキュリティチームとしてリスクアセスメント等の業務を実際に行いました。
- チームの方の知識の豊富さもすごく、日々新しく生まれる攻撃手法や脆弱性への対応のキャッチアップも大切だと感じました。
- モバイルアプリからウェブサービスまでリスクアセスメントを広く行うことができ、RAの面白さや難しさを感じることのできるインターンシップでした。
- RAの対象もサービスごとに使われる言語やフレームワークが様々であり、それぞれの要点を抑えつつ脆弱なポイントを広い視点で探していくことが大切と感じました。
- 期間を通してサポートしてくださったメンターの方やASTのメンバの皆さん、本当にありがとうございました。
余談
出社
インターンの期間中に四谷のオフィスに2回ほど出社させていただきました。執務室はフリーアドレスの席が多く、そこで作業をしました。昇降デスクや(自宅よりも)広い机でとてもいい作業環境でした。 (本当は1回だけ行くつもりでしたが、環境が良かったのでもう1度行ってしまいました。)
お昼はお弁当が全部500円だったり、サラダが100円で買えたり、飲み物も安く買えたり、食の面も充実してました!
また、福利厚生として500円で受けられるマッサージがあったのですが、そちらも受けにいき、疲れた体を癒すことができました! (お昼+マッサージで1000円ってやばいですね!)
ランチ会
インターンの期間のちょうど真ん中ごろにチームの方とのランチ会の場を設けさせていただきました。とはいえ、オンラインだったので社内のサービスを利用して頼んだ同じお弁当を食べながらZoomでおしゃべりするという形式でした。チームの方の人柄などが知れてとてもいいランチ会でした!