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

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

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

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

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
clr — ライフタイムおよびその他のリファインメント型のチェッカー | Kitploit
ツール/GitHubGitHub/ityonemo/clr
静的分析脆弱性分析コード分析ファジングバイナリ解析学習と教育
GitHubityonemo/clr

clr

ライフタイムおよびその他のリファインメント型のチェッカー

リポジトリを見る
277219日前Kitploit レビュー済み

人気

すべて見る →

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

すべてのツールを探索

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

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

CLR

Checker of Lifetimes and other Refinement types

for Zig

動画: https://www.youtube.com/watch?v=mf0WzTOe-40 スポンサー募集: https://buymeacoffee.com/dnautics

HNで議論: https://news.ycombinator.com/item?id=42923829

lobste.rsで議論: https://lobste.rs/s/9sitsj/clr_checker_for_lifetimes_other

ライブデモ動画: https://www.youtube.com/watch?v=ZY_Z-aGbYm8

概要

このプロジェクトは、Zigコンパイラ向けのトランスパイラを生成します。AIR(抽象中間表現)を、コンパイル時に静的解析を実行するZigソースコードに変換します。生成されたアナライザは、初期化前使用、解放後使用、スタックポインタのエスケープなどのメモリ安全性問題、および非null表明違反、タグ付きユニオン違反、fieldParentPtrの誤用などZig特有の未定義動作を検出します。

目標は、言語自体を変更することなく、AIRの静的解析を通じてZigにRustレベルのメモリ安全性保証をもたらすことです。

CLRは、フォークされたバージョンのZigコンパイラ(サブモジュールとしてzig/に含まれています)に依存しており、AIRを外部プラグインにルーティングする機能を追加しています。-ofmt=air -fair-out=<plugin.so>で呼び出すと、コンパイラは指定された共有ライブラリをロードし、生成されたAIRを処理のために渡します。

安全性指向アーキテクチャ

CLRは、すべての技術的に有効なZigプログラムを認識するだけでなく、リソースの状態が型と制御フロー構造で明示的かつ局所的に検証可能なライフサイクルパターンへプログラムを導くことを意図しています。2つの表現が可能な場合、CLRはリソース状態を型と制御フロー構造で可視化する方を優先します。

例えば、非オプショナルなファイル記述子を条件付きでクローズするのは避けてください:

root@kitploit:~
const file = try std.fs.cwd().openFile(path, .{});
if (should_close) {
    file.close(); // Bad: file is ambiguously open after this branch.
}

条件付き所有権はオプショナルで表現することを推奨します:

root@kitploit:~
var file: ?std.fs.File = null;
if (should_open) {
    file = try std.fs.cwd().openFile(path, .{});
}

if (file) |open_file| {
    open_file.close();
}

非オプショナルな記述子を条件付きでクローズすると、ブランチ後にそのライフサイクルがあいまいになります。CLRの意図するポリシーは、永続的な"maybe closed"状態を持ち越さず、そのパターンを拒否することです。

同じ原則が割り当てられたポインタにも適用されます。派生ポインタを通じて解放しないでください:

root@kitploit:~
const allocation = try allocator.alloc(u8, size);
const payload = allocation[header_size..];
allocator.free(payload); // Bad: payload is not the allocation base.

割り当てベースのポインタは解放用に保持し、派生ポインタはアクセスにのみ使用してください:

root@kitploit:~
const allocation = try allocator.alloc(u8, size);
defer allocator.free(allocation);

const payload = allocation[header_size..];
use(payload);

フィールドポインタ、サブスライス、または算術演算によって生成されたポインタを解放することは、文書化された内部ルールが割り当てベースの由来を再確立しない限り拒否されます。

これらのポリシーはデフォルトで厳格です。なぜなら、よりシンプルでレビューしやすいリソースライフサイクルを持つコードを生成するからです。将来のunsafeアノテーションメカニズムにより、選択されたGIDや操作が個別の分析をオプトアウトできるようになります。これにより、プログラムの残りの部分に対するデフォルトモデルを弱めることなく、パフォーマンスのために弱いチェックを意図的に受け入れるコードをサポートします。

ステータス

これは、元のElixirベースの概念実証をZigで積極的に書き換えたものです。Zig実装はコンパイラプラグインとしてロードされ、AIRを直接解析します。

現在実装済み:

  • 未定義値追跡(初期化前使用、構造体のフィールドレベル追跡)
  • メモリ安全性解析(解放後使用、二重解放、メモリリーク、アロケータ不一致、スタックエスケープ)
  • 完全なstd.mem.Allocatorインターフェースカバレッジ:
    • create/destroy - 単一アイテム割り当て
    • alloc/free - スライス割り当て(alignedAlloc、allocSentinelなどを含む)
    • realloc/remap - スライス再割り当て、古いスライスの解放追跡付き
    • dupe/dupeZ - スライスの複製
    • アロケータ不一致検出(誤ったアロケータでの解放、create/destroyとalloc/freeの混在)
    • 複雑なアロケータ型(GPA、ArenaAllocator、FixedBufferAllocator)
  • ArenaAllocatorライフサイクル追跡:
    • init/deinit/ - 完全なアリーナライフサイクル

計画(詳細はLIMITATIONS.mdを参照):

  • async/await
  • エイリアス安全性(競合する可変参照の検出)
  • マージされたまたは間接的なポインタ由来のための複数ソースポインタ洗練
  • 現在カバーされているfd伝播パターンを超えた記述子エイリアス解析
  • より完全な手続き間/グローバルな変更サマリ
  • アライメントキャスト低下認識
  • ミューテックス安全性(lock/unlockペアリング、デッドロック検出)
  • カスタム強制能力(ユーザー定義の洗練ルール)

前提条件

  • Zig 0.15.2(LLVMサポート付きシステムインストール)
  • Linux(現在のところ、syscallを直接使用するためLinuxのみ)
  • BATS(統合テスト用):sudo apt install bats

ビルド

ベンダー版のZigコンパイラとlibclrプラグインは、同じ最適化レベルでビルドする必要があります。 最適化レベルが一致しないとセグメンテーションフォルトが発生します。

root@kitploit:~
# カスタムZigコンパイラをReleaseFastでビルド(初回のみ、またはサブモジュール変更後)
cd zig && zig build --zig-lib-dir lib -Doptimize=ReleaseFast && cd ..

# CLRプラグインを一致する最適化でビルド
zig build -Doptimize=ReleaseFast

開発/デバッグ用には、両方でReleaseSafeまたはDebugを使用します:

root@kitploit:~
# ReleaseSafe(安全性チェック付き、少し遅い)
cd zig && zig build --zig-lib-dir lib -Doptimize=ReleaseSafe && cd ..
zig build -Doptimize=ReleaseSafe

# Debug(完全なデバッグ情報、最も遅い)
cd zig && zig build --zig-lib-dir lib && cd ..
zig build

使い方

root@kitploit:~
# AIRバックエンドを使用してZigファイルをコンパイル
zig/zig-out/bin/zig build-exe -fair-out=zig-out/lib/libclr.so -ofmt=air -femit-bin=output.air.zig your_file.zig

# 生成されたアナライザを実行
zig run --dep clr -Mroot=output.air.zig -Mclr=lib/lib.zig

出力はstderrに送られます。

テスト

root@kitploit:~
# ユニットテスト(コード生成/DLL)
zig build test

# ユニットテスト(ランタイムライブラリ)
zig test lib/lib.zig

# 特定の統合テストファイル
bats test/integration/fd.bats

# 統合テスト(BATSが必要)
# デフォルトはReleaseFast。OPTIMIZE=ReleaseSafe または OPTIMIZE=Debug で上書き可能。
./run_integration.sh

# 単一ファイルの手動テスト
./run_one.sh test/cases/undefined/use_before_assign.zig

注意: 統合テストは、指定された最適化レベル(デフォルト: ReleaseFast)でlibclrを再ビルドします。 ベンダー版のZigコンパイラが一致する最適化レベルでビルドされていることを確認してください。

プロジェクト構造

root@kitploit:~
clr/
├── src/                     # DLL/プラグインコード(.air.zigを生成)
│   ├── clr.zig              # メインCLRプラグインエントリポイント
│   ├── codegen.zig          # AIR命令から.air.zigソースを生成
│   └── allocator.zig        # DLLセーフなアロケータラッパー
├── lib/                     # ランタイム解析ライブラリ
│   ├── lib.zig              # ライブラリエントリポイント
│   ├── tag.zig              # AnyTagユニオン、Type、タグハンドラ、splatディスパッチ
│   ├── Inst.zig             # 命令結果と手続き間解析
│   ├── Refinements.zig      # 洗練型(ポインタ、構造体、オプショナルなど)
│   ├── Analyte.zig          # 解析状態コンテナ
│   ├── Context.zig          # 実行コンテキスト(メタデータ、エラー報告)
│   └── analysis/            # 解析モジュール
│       ├── undefined_safety.zig  # 初期化前使用追跡
│       ├── memory_safety.zig     # 割り当て/解放追跡
│       ├── null_safety.zig       # オプショナルアンラップチェック
│       ├── variant_safety.zig    # タグ付きユニオンフィールドアクセス
│       └── fd_safety.zig         # ファイル記述子追跡
├── test/
│   ├── integration/         # BATS統合テスト
│   │   ├── test_helper.bash
│   │   └── *.bats
│   └── cases/               # テスト入力ファイル(.zig)
├── zig/                     # Zigコンパイラサブモジュール(インストルメント化フォーク)
├── build.zig                # ビルド設定
└── build.zig.zon            # パッケージ依存関係

基本アイデア

図

Zigは有名な"unsafe"言語です。メモリ管理は手動で行われ、実装エラーの可能性が生じます。Zigは、安全性チェック付きコードで範囲外配列アクセスやヌルポインタ参照を排除することで、C言語に比べてセキュリティ問題を軽減しますが、静的解析により解放後使用、二重解放、データ競合を排除するRustほど安全ではありません。

RustのMIRIプロジェクトに触発され、CLRはZigのAIR中間表現に対して静的解析を実行し、Zigが標準で提供するよりも高い安全性を実現します。MIRIがRustのMIRをサンドボックス化された疑似ランタイムで解釈するのとは異なり、CLRはAIRをZigソースコードにトランスパイルし、静的解析を実行します。CLRのair出力zigコードは原理的にコンパイル時に実行可能ですが、zig中間体を経由することで、理解しやすくデバッグしやすい論理フローを生成します。野心的な人は、この一般的なアプローチを使用して、証明アシスタント言語など別の出力ターゲットを生成したり、zigコンパイラ内で完全に実行するようにリファクタリングしたりできます!

重要な洞察:セキュリティ重視のRustプロジェクトにどうせMIRIが必要なら、なぜもっとシンプルな言語を選んで、MIRIスタイルの解析を実行して借用チェックやその他の洗練型解析を実現しないのか?このプロジェクトは、そのような未来がZigにとって現実的な可能性であることを示しています。

Zigコンパイルパイプライン:

  1. Zigコード / AST
  2. Zig ZIR(型なし、ファイルごとの中間表現)
  3. Zig AIR(型付き、関数ごとのIR、多態関数のために具体化)
  4. コンパイラターゲット

AIRは解析に理想的なレベルです。なぜなら、型付けされており、一般化されたプログラミング命令の"最小限実行可能"リストとして解釈でき、洗練メタデータで型を拡張できるからです。

ZigのAIRの詳細については、Mitchell Hashimotoのブログ記事を参照してください:https://mitchellh.com/zig/sema

ライセンス

MITライセンス - 詳細はLICENSEを参照してください。

ツールをダウンロード
allocator
  • deinit時に解放されるアリーナ割り当て(誤ったリーク陽性なし)
  • deinit後使用、二重deinit、deinit後割り当ての検出
  • アロケータ間不一致(アリーナとpage_allocator)
  • 派生ポインタ追跡(フィールドポインタ、サブスライスの解放を禁止 - ルート割り当てのみ許可)
  • ポインタ算術安全性(単一アイテムポインタに対するptr_add/ptr_subをブロック)
  • null安全性(未チェックのオプショナルアンラップ検出)
  • バリアント安全性(非アクティブなユニオンフィールドへのアクセス、ブランチ後のあいまいなバリアント)
  • FieldParentPtr安全性(フィールドポインタからの無効なコンテナ復元を検出)
  • 手続き間解析(ポインタ引数を介した関数呼び出し間での値追跡)
  • 関数ポインタ追跡(間接呼び出しを可能なターゲットにディスパッチ)
  • 構造体とユニオンのフィールド追跡(ポインタフィールド、ネストされた型)
  • スライス追跡(領域を使用した割り当て/解放、サブスライス派生)
  • エラーユニオンサポート(try式、ペイロードのラップ/アンラップ)
  • switch文サポート(n方向マージとバリアント追跡)
  • ラベル付きswitch/Duff'sデバイスサポート
  • エラーメッセージ用のソース位置と変数名追跡
  • 分岐/制御フローと状態マージ
  • ループ解析(for、while、for-else、while-else、不動点反復)
  • グローバル変数追跡(未定義、バリアント、メモリ安全性)
  • 再帰的データ型(連結リスト、木、再帰的ユニオン)
  • 標準ライブラリ境界の削減(std.process.args、std.mem.asBytes、std.HashMap、アロケータ/ファイルAPIなどの一般的なパターン)
  • 特権付きstd.HashMapの洗練(正規のメタデータ/キー/バリューストレージIDをput、get、getPtr、値イテレーション間で維持)
  • ファイル記述子安全性:
    • posix.open/close/dup/dup2/socket/accept/epoll_create/pipe追跡
    • クローズ後使用検出(クローズされたfdでのread/write/dup)
    • 二重クローズ検出
    • 関数終了時およびモジュール最終化時のfdリーク検出
    • スコープ外のローカルハンドル追跡(生存しているエイリアスが時期尚早のリークレポートを抑制)
    • カバーされた記述子パターンのreturnおよび集約伝播
    • 未定義fd引数検出(未定義fdでのclose/read/write)