※こちらの記事は2021年1月18日公開note版「ラック・セキュリティごった煮ブログ」と同じ内容です
こんにちは、デジタルペンテストサービス部の山梨ブルースです。
今回は軽めのお話を紹介します。2020年より、IoT機器に関連して大騒動になったRipple20、その脆弱性のお話です。
Ripple20とは
米国企業Treck社製のTCP/IPミドルウエアにおける19個のゼロデイ脆弱性の総称となります。これらの脆弱性についてはイスラエル企業JSOFのエキスパートチームが発見した脆弱性となります。このTreck社のミドルウエアはOSに依存しない形で設計されており、これが元でネットワーク通信機能を持たないOSや独自のベアメタルアプリケーションに利用される事となり、多くのIoTデバイスおいて脆弱性の問題を残す事となりました。JSOF社や世界中のセキュリティリサーチャーの試算では億単位のIoTデバイスでこの脆弱性が存在するとされています。また、米国国土安全保障省や内閣サイバーセキュリティセンターからも注意喚起がなされています。記事を書いている現時点においても関連した脆弱性が報告されています。
脆弱性の深刻性
一般に脆弱性における危険度を示すCVSSの値において、7.0以上は重要、9.0以上は緊急の対応が必要とされています。Ripple20では、この脆弱性において、以下のCVSS値を持ちます。
特に9.0以上の値を持つ脆弱性はIoTデバイスにとっては致命的な問題を引き起こすとされています。
フラグメントとは
Ripple20を把握する上で大事なTCP/IPの専門用語があります。その中からフラグメントという言葉について先に説明したいと思います。
TCP/IPでは、一度に送信できるIPパケットのサイズをIoTデバイスまたは通信を行うデバイスが最大伝送単位(MTU: Maximum Transmission Unit)以下のサイズになるようにIPパケットを複数に分割し送信、受信側で分割されたパケットを結合し元のIPパケットを復元する作業を行います。
Ripple20の発生要因
原因1:IPパケットのサイズを超えて、多くの分割IPパケットを受信したときに、1つ目の分割IPパケットのサイズと、IPパケットサイズ(ここではIPパケット全体長)を同一に設定するバグがあった。
原因2: 分割IPパケットを結合するためにバッファのコピーを行うが、そのときにコピー先のバッファのサイズを考慮せずにコピーが行われていた。
原因2が発生すると、バッファ―オーバーフローが発生する事になります。これを悪用すれば、メモリコピーを行っている箇所のスタックフレームを破壊・改竄する事が可能となり、リモートコードを実行する事が可能となります。
結局、セキュアコーディングで無かった事が大規模な脆弱性を引き起こした事になります。昨今、企業内においては言語を問わずにライブラリ等を直接呼ばずにライブラリへの引数をチェックする機構をWrapperとして用意し、Wrapper経由で呼び出す事となっています。Treck社のミドルウエアはそうした風潮となる以前からメンテナンスされ続けたものなので、そういったセキュアコーディングによってコードの実行結果がセーフティな方向になる仕組みは用意されていなかったのでしょう。
自分が使っている機器は大丈夫?
恐らく、この記事を読んだ皆様においては、自分が使っている機器がTreck社のミドルウエアを使っているかは判別できません。透視能力があっても不可能でしょう。また、この脆弱性はTreck社だけでなく、TCP/IP機能を提供しているすべてのOS、それを使っている機器に潜在している可能性があります。
そこで、IPパケットを応用してICMP(Internet Control Message Protocol)のメッセージを応用して判別する事とします。ICMPは身近に使われていて、皆さんも自分の機器がネットワーク繋がっているかを確認するためにPINGコマンドを実行する等していると思います。それを利用したものです。
あくまでも目安ですが、ICMPエラーパケットをターゲットとしてIPパケット長として0x100を設定できるのも、Ripple20の脆弱性の特徴の一つです。よって、この設定が可能な機器はRipple20の脆弱性を含んでいる疑いがあると判断する事ができます。ただし、あくまでも目安です。本当にRipple20の脆弱性の中でも重要度の高い脆弱性を含んでいる場合には、機器メーカーのサポートニュースを調べて下さい。
調査するには以下のgithubから提供されているツールを利用します。
https://github.com/LubyRuffy/FingerPrinting-Ripple20
この中にfingerprinting.pyというPythonのコードがあります。これをPython上で実行する事によってRipple20の脆弱性に該当するかの判別が可能です。表示されるメッセージが紛らわしいのですが以下のとおりとなります。
PASS: Ripple20の脆弱性を含んでいる可能性が高い。
FAIL: Ripple20の脆弱性に該当しない。
試しに、内部ネットワークにある機器に実行した結果が上記となります。この場合、当該の機器はRipple20の脆弱性を含んでいないという結果になりました。
おわりに
Ripple20は本当に小さなバグが大規模で深刻な脆弱性を発生させたものとなります。一方で、この脆弱性の影響を受ける機器への度合いはOSによって様々となります。適切な対応方法としては、以下となります。
(1) メーカーから提供されるパッチを適用する。
(2) 速やかに影響の無い新しい機器を導入する。
(3) 機器と外部ネットワークの間にファイヤーウォールを設置する。
参考文献
[1] 19 Zero-Day Vulnerabilities Amplified by the Supply Chain. 2020,
https://www.jsof-tech.com/ripple20/