Linuxカーネルを保護するためにファーウェイ従業員が提案したパッチにセキュリティ上の問題がある

Grsecurity プロジェクトの開発者 描いた パッチセットに簡単に悪用可能な脆弱性が存在することに注意する 香港SP (Huawei カーネル自己保護)、数日前 提案された Linux カーネルのセキュリティを向上させるため。状況が思い出させる サムスンとのケース、システムのセキュリティを向上させようとした試みが新たな脆弱性の出現につながり、デバイスの侵害が容易になってしまいました。

HKSP パッチは Huawei 従業員によって公開され、GitHub プロファイルに Huawei への言及が含まれ、プロジェクト名 (HKSP - Huawei Kernel Self Protection) に Huawei という単語が使用されています。同時に、ファーウェイの代表者はHKSPプロジェクトと同社との関連性を否定し、コードは従業員の個人的なイニシアチブで開発されたものであり、ファーウェイの公式プロジェクトではなく、同社の製品には使用されていないと述べた。の上 GitHubページ HKSP 遡及 発見後 脆弱性も 追加されました このプロジェクトは研究目的で私の余暇を利用して開発されていることに注意してください。

HKSP には、cred 構造内のオフセットのランダム化、ユーザー識別子の名前空間 (pid 名前空間) への攻撃に対する保護、mmap 領域からのプロセス スタックの分離、kfree 関数への二重呼び出しの検出、擬似関数を介したリークのブロックなどの変更が含まれています。 -FS /proc (/proc/ {モジュール、キー、キーユーザー}、/proc/sys/kernel/* および /proc/sys/vm/mmap_min_addr、/proc/kallsYSms)、ユーザー空間アドレスのランダム化の改善、Ptrace の追加保護、強化された smap および smep 保護、生のソケットを介したデータの送信を禁止する機能、UDP ソケット内の不正なアドレスをブロックする機能、および実行中のプロセスの整合性をチェックする機能。また、典型的なルートキットを導入しようとする試みを検出することを目的とした Ksguard カーネル モジュールも含まれています。

パッチ 原因 Linux カーネルの安定版ブランチの保守を担当する Greg Kroah-Hartman 氏は興味を持ち、レビューとメイン カーネルへの昇格を簡素化するためにモノリシック パッチをいくつかの部分に分割するよう作者に依頼しました。キース・クック部長 プロジェクト 上の プロモーション Linux カーネルのアクティブ保護テクノロジーも 積極的に パッチに対応し、問題の中でも、x86 アーキテクチャへのバインディングと、問題に関する情報をログに記録するだけで問題をブロックしようとしない多くのモードの通知の性質に注意を喚起しました。

Grsecurity 開発者によるパッチの調査では、コード内の多くのエラーと弱点が明らかになり、プロジェクトの機能を適切に判断できる脅威モデルが存在しないことも明らかになりました。コードが安全なプログラミング手法を使用せずに記述されたことを明確に示すために、ハンドラーの些細な脆弱性の例を示します。
ファイル /proc/ksguard/state。これは権限 0777 で作成され、全員が書き込みアクセス権を持っていることを意味します。 /proc/ksguard/state に書き込まれたコマンドを解析するために使用される ksg_state_write 関数は、ターゲット バッファのサイズを考慮せず、渡されたオペランドのサイズに基づいてデータが書き込まれる tmp[32] バッファを作成します。パラメータを文字列サイズでチェックします。それらの。カーネル スタックの一部を上書きするには、攻撃者は特別にフォーマットされた行を /proc/ksguard/state に書き込むだけで済みます。

static ssize_t ksg_state_write(struct file *file, const char __user *buf,
size_t len、loff_t *オフセット)
{
u64 値;
char tmp [32];
サイズ_t n = 0;

if (copy_from_user(tmp, buf, len))
-1を返します。

値 = simple_strtoul(tmp, '\0', 10);
...

エクスプロイトプロトタイプ:

char buf[4096] = { };
int fd = open(“/proc/ksguard/state”, O_WRONLY);
if (fd >= 0) {
write(fd, buf, sizeof(buf));
閉じる(fd);
}

出所: オープンネット.ru

コメントを追加します