PSIRT ブログ
影響を受けるプラットフォーム: FortiOS
影響を受けるユーザー: 政府機関および大企業
影響: データの損失およびOSとファイルの破損
深刻度: 高
フォーティネットは、2023年3月7日にCVSS Medium PSIRTアドバイザリ(FG-IR-22-369 / CVE-2022-41328)を公開しました。このブログでは、本脆弱性の発見につながったインシデントに対する初期の調査、および継続的な分析中に特定された追加のIoC(Indicators of Compromise:侵害指標)の詳細について説明しています。
フォーティネットが調査したきっかけは、顧客の複数のFortiGateデバイスで、突然発生したシステム停止とそれに続くブート障害(侵害から保護するための設計)でした。
それらのデバイスは、以下のエラーメッセージを出力して停止しました。
“System enters error-mode due to FIPS error: Firmware Integrity self-test failed(FIPSエラーにより、システムがエラーモードに移行しました。ファームウェアの整合性セルフテストに失敗しました)”
FIPS対応デバイスは、システムコンポーネントの整合性を検証します。整合性違反が検知された場合、デバイスはシャットダウンし、ネットワークの整合性を保護するために起動を拒否します。
フォーティネットは、これらのFortiGateデバイスのサブセットと、それらを管理するために使用されるFortiManagerデバイスを調査しました。その調査の詳細は以下のとおりです。
フォーティネットの調査チームは、デバイスのファームウェアイメージ内の/sbin/initが変更され、新しいファイル/bin/fgfmが追加されていることを発見しました。/sbin/initの変更により、攻撃者に永続的なアクセスとコントロールを提供できる/bin/fgfmが通常の起動アクションに進む前に実行されるようになります。この機能の詳細については、後述の「マルウェア分析」セクションを参照してください。
以下の理由により、影響を受けたFortiGateデバイスは、おそらくFortiManagerデバイスを介してアクセスされ侵害された可能性が高いと考えられます。
インシデントに関係したFortiManagerデバイスのファームウェアイメージの内容を、クリーンなFortiManagerデバイスと比較しました。その結果、rootfs.gz内の以下のファイルが異なっていました。
さらに、3つのファイルがイメージに追加され、既存のFortiManager起動スクリプトが変更されて永続化が実現しています。さらに、FortiManagerのDjangoコンポーネントも、攻撃者に永続的なアクセスとコントロールを提供するように変更されています。悪意のあるファイルとその機能の詳細については、「マルウェアの分析」セクションを参照してください。
調査したログには、FortiManagerデバイスから配信されたスクリプトがFortiGate上で実行された証拠が含まれていました。以下の表は、「msg」フィールドに「upload-icon」と「run script」コマンドが含まれるログを示しています。
ログの内容を見ると、FortiManagerのアップロードスクリプト機能を介して、さまざまなFortiGateでスクリプトが実行されていることがわかります。
同時に、「Command failed」ログが記録されています。このログは、パストラバーサルエクスプロイトを試みた証拠となるものです。このエクスプロイトにより、指定されたパスでTFTPサーバーを経由して任意のファイルをFortiGateにアップロードできます。この例では、攻撃者はFortiGate上の/bin/lspciを置き換えようと試みています。ログにその痕跡はありませんが、CLIコマンド:diagnose hardware lspciを実行すると、悪意のあるlspciが実行される可能性があります。
実行されたスクリプトの内容がデバイスに残されていないため、確認できませんでした。ただし、「Command failed」ログと「run script」ログが同時に記録されていることから、スクリプトにはアップロードアイコンの脆弱性攻撃が含まれていた可能性が考えられます。
フォーティネットでは、このエクスプロイトを可能にするパストラバーサル脆弱性にCVE-2022-41328を割り当て、FortiOSのすべてのサポート対象バージョンで修正を行いました(FG-IR-22-369を参照)。
以下のセクションでは、侵害されたFortiGateおよびFortiManagerデバイスで検知されたマルウェアについて説明します。
FgfmはICMPパケットを精査します。ICMPパケットに文字列「;7(Zu9YTsA7qQ#vm」が含まれている場合、それが攻撃者からのpingであることを認識し、パケットからIPアドレスを抽出します。
抽出が完了すると、そのアドレスに戻る接続を確立し(「リバースコネクトシェル」に類似)、C&Cサーバーとして機能するようになります。そうすると、C&Cサーバーから受け取ったコマンドに応じて、以下のようなさまざまなアクションを実行できます。
authの中核機能は、FortiManagerのiptablesユーティリティを変更したものと考えられます。IptablesはFortiManagerに組み込まれていますが、これを使用するにはユーザーがroot権限を持っている必要があります。このマルウェアが実行するiptablesシェルコマンドは厳密には以下のとおりです。
これは特定のソースIPから発信される宛先ポート541(FortiGuard管理ポート)に向かうトラフィックをリダイレクトするものであると考えられます。一致するトラフィックは、別のポートにリダイレクトされます。ソースIPとリダイレクトポートは、ネットワークソケットから読み取られます。
Authはまた、デバイスのネットワークインタフェースを照会し、127で始まらないIPアドレスを持つものを探します。これは、先に述べたどのアクションよりも前に行われます。
Klogdは、前述のfgfmとの類似点があります。リモートシェル実行に似たコードが含まれており、ファイルの読み書き機能もあります。
fgfmとのその他の類似点:
ネットワークの機能については詳細には分析されていません。ただし、ICMPトンネルを使用するfgfmとは異なるようです。以下では、ネットワークソケットの機能について説明します。
Supportは、/bin/klogdと/bin/authを実行するBASHスクリプトである。また、/bin/klogd、/nohup.out、/bin/supportを削除する。
Smitは、起動時のファームウェア検証を無効にするように変更されている。
Localnetは、FortiManagerの起動スクリプトを変更したもので、2行追加されている。最初の行は、起動時にファームウェア検証を再度有効にするように/bin/smitを変更する。これは、実行中のデバイスには何の影響もなく、smitが変更されたという事実を隠すために実行される可能性が高い。2行目は/bin/supportを実行する。
FortiManagerのこれらのDjangoコンポーネントも変更されています。システム上のUrls.pyには、追加のWebエンドポイント「show_device_info/」を公開するコードが含まれていました。このエンドポイントにアクセスすると、views.pyに追加された悪意のあるコードが実行されます。
views.pyでは、show_device_info/ エンドポイントにアクセスすると、get_device_info関数が実行されます。get_device_infoの変更により、攻撃者がリモートでデバイスを制御できるようになる可能性があります。この関数は、FGMGTOKENとDEVICEIDというCookieを介してコマンドとデータを受け取ります。入出力データはRC4で暗号化され、以下の主要なアクションが実装されています。
このエクスプロイトの複雑からすると、攻撃者は高度なスキルを持っていることがわかります。
攻撃のターゲットは非常に絞られており、政府または政府関連のターゲットを狙い撃ちにしていることが示唆されます。
フォーティネットは、この脅威アクターの活動を引き続き追跡しています。この問題を減災するために、すべてのお客様がPSIRTアドバイザリFG-IR-22-369で推奨されているアクションをすぐに実行することをお勧めします。お客様のログにシステムから侵害の兆候が出力されていることが判明した場合、フォーティネットにお問合せください。