how2python — Pythonメモリ破損バグ集

Security

概要

how2pythonは、Python実装に起因するメモリ破損バグ(memory corruption bugs)を体系的に記録したリポジトリです。目的は、監査フック(audit hooks)などのセキュリティ機構を回避して任意メモリ書き込みに至る可能性のある脆弱性を追跡・再現することにあります。収録されているPoCは64bitのWindows/Linux上で、主にPython 3.13以降で検証されています。各エントリは「プロセスを乗っ取れるレベル」の低レベルプリミティブ(例:任意書き込みを可能にするbytearrayの生成)を示す簡易PoCを含み、脆弱性管理やセキュリティ評価のための参考になる資料を提供します。

GitHub

リポジトリの統計情報

  • スター数: 17
  • フォーク数: 2
  • ウォッチャー数: 17
  • コミット数: 2
  • ファイル数: 3
  • メインの言語: Python

主な特徴

  • Python内部実装やC拡張に関連するメモリ破損のPoCを収集・整理している点。
  • PoCはbytearrayを用いて任意メモリ書き込みプリミティブを生成することを目標にしている。
  • 64bit Windows/Linux環境、Python >= 3.13での検証事例が中心。
  • シンプルな構成で脆弱性追跡や実験に適したリファレンス的リポジトリ。

技術的なポイント

本リポジトリが注目するのは、PythonランタイムのC実装側に残る低レベルの欠陥が、どのようにして管理対象の安全機構(例:audit hooks)をすり抜け、任意のメモリ書き込みにつながるか、という点です。PoC群は直接的なエクスプロイト手順を詳細に述べるのではなく、メモリ破損を誘発してbytearrayなどのオブジェクトを介した書き込み表現を得る“プリミティブ”の作成に焦点を当てています。これには典型的に以下の技術的テーマが関わります:オブジェクトサイズの不整合や境界チェックの不備、型混乱(type confusion)、use-after-freeやdouble-freeの条件、バッファオーバーフローやバッファビュー(buffer protocol)の誤用。PoCは対象環境で再現可能性を確保するため、対象のPythonビルドやプラットフォーム依存の挙動(アドレス空間配置、DLL/SOロード時の差異、ASLRやDEPの影響など)を考慮して作られています。

また、監査フック回避に関しては、通常の高レベルなセーフガードが期待するレイヤー(Pythonレベルの呼び出しやAPIフック)をバイパスして直接メモリ空間を操作する点が重要です。つまり、監査は多くの場合Python API呼出しを監視するが、メモリ破損はC層でオブジェクトの内部表現を改変するため、監査の検知を回避できる可能性があります。これを防ぐためには、CPythonのC API側での堅牢な境界検査、ライフサイクル管理の見直し、そしてメモリ安全性に関する継続的なコードレビューとテストが必要です。最後に、こうしたPoCは攻撃的な実用化に使われるリスクがあるため、責任ある開示と修正対応の一助としてのみ閲覧・利用するべきである点を強調します。

プロジェクトの構成

主要なファイルとディレクトリ:

  • .gitignore: file
  • README.md: file
  • bugs: dir

まとめ

Python実装の低レイヤ脆弱性を整理した実践的なPoC集。セキュリティ評価の参考に有用。

リポジトリ情報:

READMEの抜粋:

how2python

Repository to keep track of python memory corruption bugs that can be used to potentially bypass audit hooks

Bugs

All exploits were tested on 64 bit versions of python on Windows and Linux and on versions >=3.13.0. Exploits might not work or need to be implemented differently on different versions of python.

All files with an exploit implemented will create a bytearray object that can write anywhere in memory which is enough to consider the process “pwned”. As a simple PoC, once…