見出し画像

『XZ Utils』の事例から見えるOSSとセキュリティ

2024年3月29日、多くのLinuxディストリビューションで採用されているOSS(オープンソースソフトウェア)の『XZ Utils』に深刻な脆弱性(CVE-2024-3094)が確認されました。
脆弱性の中身はバックドアとして動作する、意図的にソフトウェアサプライチェーン攻撃を行う仕組みでした。
一般的にIT系のエンジニアはOSSに非常によくお世話になっているため、非常に大きなニュースとなった『XZ Utils』の事例からOSSとセキュリティについてほんの少し触れてみます。

発見の経緯

PostgreSQL やMicrosoftの開発者であるAndres Freund氏は、今回の不正なコードが入った状態で、SSH経由でのログイン処理が約0.5秒に遅れる事、エラーで接続失敗したのにCPU使用率が高い事から気づいたそうです。
(違和感をそのままにしない感覚がすばらしいと思います)

どのように仕込まれたのか

非常にざっくりとまとめると以下のような流れになります。
OSSにおける管理上の問題点(以前から問題視されている内容ですが)を改めて露呈した感じですね。

1.OSSへの貢献

Jia Tan氏が約2年半前からXZ Utilsの開発に参加し始める。

2.管理者への精神的な攻撃

当初からこのOSSの開発者であるLasse Collin氏が、パフォーマンスなどを理由に第3者から執拗なメールなどで追い詰められる。

3.アクセス権の獲得

OSSへの貢献から信頼を得たJia Tan氏が、リポジトリへのコミットアクセス権、リリースマネージャー権を取得する。

4.不正なコードのコミット

連絡先などリポジトリの各種情報を改変したのち、不正コードのコミットに成功する。

ex1.メンテナが本件を計画したタイミング

Jia Tan氏が開発参画当初からバックドアの混入を目的としていたのか、純粋な開発参画後に買収されたりしたのか、今のところは明らかになっていないようです。

ex2.プルリクに出されたコードの例

攻撃コードの例ではありませんが、コミット差分の途中で行頭に『.』が入っていて、それがLandlockというLinuxのセキュリティ機能を無効化しているそうです。
(プルリクに目視で気づくのは難しいかもしれないですね。ここら辺はSASTやAIに期待の領域でしょうか。)

index 76700591059711e3a4da5b45cf58474dac4e12a7..d2b1af7ab0ab759b6805ced3dff2555e2a4b3f8e 100644 (file)
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -901,10 +901,29 @@ endif()
 
 # Sandboxing: Landlock
 if(NOT SANDBOX_FOUND AND ENABLE_SANDBOX MATCHES "^ON$|^landlock$")
-    check_include_file(linux/landlock.h HAVE_LINUX_LANDLOCK_H)
+    # A compile check is done here because some systems have
+    # linux/landlock.h, but do not have the syscalls defined
+    # in order to actually use Linux Landlock.
+    check_c_source_compiles("
+        #include <linux/landlock.h>
+        #include <sys/syscall.h>
+        #include <sys/prctl.h>
+.
+        void my_sandbox(void)
+        {
+            (void)prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
+            (void)SYS_landlock_create_ruleset;
+            (void)SYS_landlock_restrict_self;
+            (void)LANDLOCK_CREATE_RULESET_VERSION;
+            return;
+        }
+
+        int main(void) { return 0; }
+        "
+    HAVE_LINUX_LANDLOCK)
 
-    if(HAVE_LINUX_LANDLOCK_H)
-        set(SANDBOX_COMPILE_DEFINITION "HAVE_LINUX_LANDLOCK_H")
+    if(HAVE_LINUX_LANDLOCK)
+        set(SANDBOX_COMPILE_DEFINITION "HAVE_LINUX_LANDLOCK")
         set(SANDBOX_FOUND ON)
 
         # Of our three sandbox methods, only Landlock is incompatible

https://git.tukaani.org/?p=xz.git;a=commitdiff;h=328c52da8a2bbb81307644efdb58db2c422d9ba7

ex3.影響のあるディストリビューション

記載の以下のサイトで確認可能です。https://piyolog.hatenadiary.jp/entry/2024/04/01/035321

※以下のように直接XZからバージョン確認することは避けた方が良いです。

$ xz -V

不正なコミットに気づくためには

こちらはOSSに限った話では無いと思いますが、不正なコードの混入は知見者による重厚なレビューでも気づけるかもしれません。ただし、人間の対応には限界があるため以下のようにツールの力を借りてCI/CDの工程で検出出来るようにするのが現実的です。

SAST(いわゆる静的コード解析)の利用

ソースコードを解析して、脆弱性やその他コードの明らかに不具合と思われる記述や冗長な箇所などを洗い出してくれる仕組みです。

Copilotの利用

生成系AIの力でプルリクの概要を表示します。必ず不正コードを指摘してくれるか定かではないですが、ヒントとなる情報は示してくれるのではないかと思います。(個人的な見解です。)

OSSの開発者や利用者セキュリティ対策

経済産業省

『オープンソースソフトウェアの利活用及びそのセキュリティ確保に向けた管理手法に関する事例集』を取りまとめています。
https://www.meti.go.jp/press/2022/05/20220510001/20220510001.html

OSSF(Open Source Security Foundation)

Linux Foundation Projectsの一つであり、ソースコード管理のベストプラクティスなどのガイドラインなどを出しております。
日本語化などもされているので非常に参考になります。
https://www.linuxfoundation.jp/resources/openssf-guides-jp/


上記のようなガイドラインを読みつつ、関係者が脅威インテリジェンスを行って、今回のような開発に影響のあるセキュリティ情報を、メンバーに共有していくことが大事だと思います。

最後に

OSSは非常に便利であり、利用することでクリエイティブな開発に集中出来たり、無駄を省いたり出来ます。パッケージ管理ソフトの普及もあり、知らず知らず利用していたりもします。
一方で、利用するに当たっては、セキュリティ的な視点も含めてリスクを伴う事も忘れないようにしたい。

参考

~以下宣伝です~

当社ではDevOpsに対してさらにセキュリティ組み合わせた(いわゆるDevSecOpsのための)セキュリティサービスを提供しています。
今回のようなOSSを利用したソフトウェアサプライチェーン攻撃の検出も可能で、SASTを利用したコード解析も組み込まれています。
興味がありましたら、ぜひこちらからお問い合わせいただければ幸いです。




この記事が気に入ったらサポートをしてみませんか?