Rust プログラミング言語の欠陥が FIX:ファイル/ディレクトリ不正削除に対応

A flaw in Rust Programming language could allow to delete files and directories

2022/01/24 SecurityAffairs — プログラミング言語 Rust のメンテナたちは、CVE-2022-21658として追跡されている深刻度 High の脆弱性に対して、セキュリティ・アップデートをリリースした。この脆弱性をトリガーとして攻撃者が悪用すると、脆弱なシステムからのファイルやディレクトリの削除を許してしまう。

Rust Security Response WG は、std::fs::remove_dir_all 標準ライブラリ関数に、シンボリックリンク・フォロー (CWE-363) を可能にする競合状態の脆弱性があることを通知した。攻撃者は、このセキュリティ問題を悪用して、特権を持つプログラムを騙し、他の方法ではアクセスや削除ができないファイルやディレクトリを削除できるという。この脆弱性は、Rust 1.0.0〜Rust 1.58.0 に影響するが、先週リリースされた Rust 1.58.1 で対処されている。

あるシステムに非特権でアクセスできる攻撃者が、自分には削除する権限がない sensitive/ というシステム・ディレクトリを削除しようとする場合には、自身がアクセスできるディレクトリ (temp/) を削除する特権プログラムを見つけ、temp/foo から sensitive/ へのシンボリック・リンクを作成し、特権プログラムが foo/ を削除するのを待つことが可能となる。特権を持つプログラムは、temp/foo から sensitive/ へのシンボリック・リンクを辿りながら、再帰的に削除を行い、結果としてsensitive/ が削除されてしまう。

このアドバイザリによると、std::fs::remove_dir_all には、シンボリック・リンクの再帰的削除に対する保護機能が既に含まれているが、正しく実装されていない。

アドバイザリには、「残念ながら、そのチェックは標準ライブラリに正しく実装されず、TOCTOU (Tim-of-check Time-of-use) 競合状態を引き起こしていた。シンボリック・リンクを辿らないようにシステムに指示する代わりに、標準ライブラリは削除しようとしているものがシンボリック・リンクであるかどうかを最初に確認し、そうでなければディレクトリの再帰的な削除を進めていた。そのため、攻撃者が何らかのディレクトリを作成し、そのディレクトリをシンボリック・リンクで置き換えるという競合状態が発生していた。つまり、シンボリック・リンクへの置き換えが可能になっていた。この攻撃は、最初から成功するとは限らないが、私たちの実験では、数秒以内に確実に実行することができていた」と説明している。

Log4j のケースでも明らかなように、ライブラリの脆弱性は、とても対応が厄介です。Rust がコンパイラなだけに、また、この脆弱性が標準ライブラリ関数に存在するだけに、さまざまな アーティファクトに影響が及んでいるはずです。その点が、最大の心配事になります。この記事とは直接に関連しませんが、2021年7月の「攻撃者たちが Go / Rust / Nim / DLang を使うのは何故なのか?」は、なかなかおもしろい内容でした。他にも Rust 関連の記事が何本かありますので、よろしければ Rust で検索も、ご利用ください。

%d bloggers like this: