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

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

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

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

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
cve-2023-34446 — CVE-2023-36664 的概念验证漏洞利用,这是一个 Ghostscript 命令注入漏洞。包括 Docker 实验室环境、管道验证绕过的详细分析以及逐步复现指南。 | Kitploit
ツール/GitHubGitHub/minsmiths/cve-2023-34446
脆弱性分析コード分析エクスプロイト学習と教育バイナリエクスプロイトラボと実践
GitHubminsmiths/cve-2023-34446

cve-2023-34446

CVE-2023-36664 的概念验证漏洞利用,这是一个 Ghostscript 命令注入漏洞。包括 Docker 实验室环境、管道验证绕过的详细分析以及逐步复现指南。

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

人気

すべて見る →

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

すべてのツールを探索

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

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

CVE-2023-36664: Ghostscript リモートコード実行

脆弱性概要

CVE ID: CVE-2023-36664
製品: Ghostscript (< 10.01.2)
脆弱性タイプ: リモートコード実行 (RCE)

概要

本脆弱性(CVE-2023-36664)は、Ghostscriptがパイプデバイス(%pipe%または|プレフィックス)に対するパス権限検証を不十分に処理することによって発生する任意コード実行(RCE)脆弱性である。

攻撃者によって悪意を持って操作された文書ファイル(PS/EPS)をシステムがパースまたは処理する過程で、ユーザーの許可なしに任意のシステムコマンドが実行される可能性がある。

[概念説明] Ghostscriptとパイプ(Pipe)の理解

1. Ghostscriptとは何か?.

主な役割: 本質的にテキストで構成されたグラフィック座標コード(例:「100 200の位置に線を引け」)を読み取り、私たちが目で見ることができるモニター画面やプリンター出力用の画像ファイルに変換する役割を担う。

2. パイプ(Pipe)とは何か?

パイプは、あるアプリケーションの出力を別のアプリケーションの入力に接続し、ソフトウェア間で相互に通信できるようにする機能である。コマンドでは|記号で表される。

例: cat /etc/hosts | grep localhost

  • catコマンドが出力したテキスト全体のデータがパイプ(|)を通ってgrepコマンドの入力値として直接渡され、「localhost」を含む行だけがフィルタリングされる。

脆弱性の理解

脆弱性の根本原因

Ghostscriptは、基本的にセーフモード(-dSAFER)が有効になっている場合、システムの機密ファイルにアクセスしたり外部コマンドを勝手に実行したりできないように、ファイルパスを厳格に検査する。

問題点: 攻撃者がファイルパスの位置に通常のファイル名ではなくパイプデバイスのプレフィックス(%pipe%または|)を精密に操作して押し込んだ場合、Ghostscript内部の権限検証ロジックがこのプレフィックスを正しく認識できず、「安全なパス」または「検証対象外のもの」と誤認して通過させてしまう。

結果: 本来であれば弾かれるべき危険なコマンドが、検証ループをあっさりと迂回してしまうことになる。

脆弱性の実行メカニズム

悪意のあるファイル注入: 攻撃者がPostScript(.ps/.eps)ファイル内部に(%pipe%悪意あるコマンド) (モード) file /DCTDecode filterのような形式でコードを埋め込む。

パースおよび誤認: Ghostscriptがこのファイルを読み取って処理する過程で、権限検証段階(門番)をエラーなく通過する。

OSシェルへの受け渡し: 検証を通過したコマンドストリームが、パイプデバイス機能によってLinuxのshやWindowsのcmdなどのOS内部シェルにそのまま渡され、バックエンド権限で実行される。

脆弱コードの確認

パッチされたコードを見ると、次の2つの.cファイルが修正されたことが確認できる。

  1. base/gpmisc.c
  2. base/gslibctx.c

ここではgpmisc.cを見ながら脆弱性を理解すればよい。

png2

この脆弱性の核心は、%pipe%のような特殊パスを通常のファイルパスと正しく区別できず、そのまま通常のパスとして認識してしまうことにある。

パス整理関数: gp_file_name_reduce

これを確認するために、ファイルパスを整理する関数を見てみる必要がある。gpmisc.cでパスを整える役割を担う関数はgp_file_name_reduce(...)であり、この関数は内部的にgp_file_name_combine()を呼び出してその結果を返す。

root@kitploit:~
gp_file_name_reduce(const char *fname, uint flen, char *buffer, uint *blen) {
    return gp_file_name_combine(fname, flen, fname + flen, 0, false, buffer, blen);
}

gp_file_name_combine()は、その名前の通り、受け取ったファイルパスから./や//のような不要な相対パス表現を除去する関数である。

問題はここで発生する。もしこの関数に通常のファイルパスではなく、%pipe%のようにコマンド実行を誘導する特殊な文字列が入力されると、関数はこれを正常なパスパターンとして認識できず、何の処理もせずに元の文字列をそのまま返す。

検証ロジックの欠如: gp_validate_path_len

png1

gp_validate_path_len(...)は、内部的にgp_file_name_reduce()を呼び出してパスを検証する関数だが、この過程で入力値が通常のファイルパスなのか%pipe%のようなコマンド実行構文なのかを区別する独立した検証ロジックは存在しない。

結果的に、%pipe%を含む文字列が何のフィルタリングもなくそのまま通過することになり、これが今回の脆弱性の根本原因である。

したがって、%pipe%touch /tmp/pwnedのような文字列がファイルパスとして渡されると、ユーザーは単に画像ファイルをレンダリングしようとしただけなのに、実際にはtouch /tmp/pwnedコマンドが実行され、/tmp/pwnedファイルが生成される結果につながる。

アーキテクチャ

root@kitploit:~
┌─────────────────────────────────┐
│  Docker Container            │
│  (Ubuntu 22.04 + Ghostscript)   │
│                                 │
│  /home/test/               ← Working directory
│  ├── poc.py               ← PoC 생성 스크립트
│  |                              |
│  └── /var/www/html/config.php   ← 민감 정보 파일
│                                 │
│  User: test (비 root)           │
│  Ghostscript: 10.01.1 (취약)    │
└─────────────────────────────────┘

ここでrootアカウントではなく一般アカウントを選択した理由は、実際の運用サーバーではセキュリティ上、rootアカウントを直接使用しないのが一般的だからである。したがって、実際のサーバーが攻撃される状況を可能な限り忠実に再現するために、一般アカウント基準で環境を構成した。

Docker Composeの設定

root@kitploit:~
version: '3.8'

services:
  gs-lab:
    build: .
    container_name: cve_lab
    network_mode: "host"
    environment:
      - DISPLAY=${DISPLAY}
    volumes:
      - /tmp/.X11-unix:/tmp/.X11-unix:ro
      - ./poc.py:/home/test/poc.py
    stdin_open: true
    tty: true

環境

  • DISPLAY=${DISPLAY}: ホストのX11ディスプレイサーバーにコンテナ内のGUIアプリケーションがアクセスできるように環境変数を渡す。

ボリューム

  • /tmp/.X11-unix:/tmp/.X11-unix:ro: ホストのX11ディスプレイサーバーとコンテナ間の通信用Unixソケットをマウントする。

  • ./poc.py:/home/test/poc.py: ホストのローカルPoCスクリプトをコンテナの実行環境にマウントする。

Dockerfile

root@kitploit:~
FROM ubuntu:22.04

RUN apt update && \
    apt install -y \
    wget \
    build-essential \
    gedit \
    python3 \
    sudo && \
    rm -rf /var/lib/apt/lists/*


RUN wget https://github.com/ArtifexSoftware/ghostpdl-downloads/releases/download/gs10011/ghostscript-10.01.1.tar.gz && \
    tar -xzf ghostscript-10.01.1.tar.gz

WORKDIR /ghostscript-10.01.1

RUN ./configure && \
    make && \
    make install

RUN mkdir -p /var/www/html && \
    echo "DB_PASSWORD=SuperSecret1234!!!" > /var/www/html/config.php

RUN useradd -m -s /bin/bash test

WORKDIR /home/test
USER test

CMD ["/bin/bash"]

基本的なapt install

基本的なPoC環境を構成するには、Ghostscriptの脆弱バージョンを取得するためのwget、tar.gzの圧縮を解いた後にソースをインストールするためのbuild-essential、.ps実行時に悪意を持って起動させるメモ帳(gedit)などがある。

Ghostscript 10.01.1のインストール

png3 png4 Ghostscriptの脆弱バージョン10.01.1は、gitからソースを取得してインストールした。RUN ./configure && \ make && \ make installは、ソースをダウンロードしたフォルダに使用方法が記載されていたので、それに従ってインストールしたものである。

奪取する情報

通常、/var/www/html/config.phpにはWebアプリケーションの核心的な設定値が入る。例えばデータベース名、パスワード そこで、任意にDBパスワードを奪取する想定でconfig.phpファイルを生成する。

一般アカウントの作成

rootアカウントではなく一般アカウントtestでPoCを行う予定なので、新しいユーザーを作成する。


再現手順

1. 環境構築

root@kitploit:~
# Docker 이미지 빌드
docker compose -f docker-compose.yml up -d

# 컨테이너 실행
docker exec -it cve_lab bash

2. PoCファイルの生成

コンテナ内で: png5

root@kitploit:~
python3 poc.py -p "gedit /var/www/html/config.php" -m r -f test

生成結果: png6

入力した悪意のあるパスが.ps内に正しく入っていることが確認できる。

3. Ghostscriptによる悪意のあるファイルの処理

root@kitploit:~
gs -dNOSAFER test.ps

png7

4. 結果の確認

geditが自動的に開き、/var/www/html/config.phpの内容が露出する。

root@kitploit:~
DB_PASSWORD=SuperSecret1234!!!

対策

png8

1. セキュリティパッチの適用およびアップデート

公式に脆弱性が修正されたGhostscript 10.01.2以上の最新バージョンへアップデートを実行する必要がある。

2. パッチソースコード分析による防御メカニズムの理解

公式パッチでは、gp_validate_path_len()関数内でgp_file_name_reduce()を呼び出す前に検証を行うロジックが追加された。

パイプ特殊文字列の例外処理およびブロックの強制: 入力パスのプレフィックスが%pipe%または|記号で始まる場合を、別途完全に検出する分岐文が追加された。

公式パッチバージョン: https://github.com/ArtifexSoftware/ghostpdl/commit/5f56c6f6f989816fc9cc671116740acecbed5b6c

参考資料

  • CVE公式ページ: https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2023-36664
  • CVEの理解: https://www.vicarius.io/vsociety/posts/cve-2023-36664-command-injection-with-ghostscript
  • PoC再現: https://github.com/jakabakos/CVE-2023-36664-Ghostscript-command-injection

ツールをダウンロード