llvm-security について
llvm-securityは、LLVMのセキュリティ機能と実践を扱う開発者向けスキルです。サニタイザー、コンパイラの強化、シンボリック実行、ファジングを案内します。
主な機能
- 01サニタイザーの選択と使用
- 02コンパイラの強化手法
- 03シンボリック実行のガイド
- 04セキュリティ重視の実行時解析
- 05サニタイザー併用のファジング
活用シーン
- 01C/C++プログラムのメモリエラー検出
- 02脆弱性悪用に備えたビルドの強化
- 03シンボリック実行による実行経路の探索
- 04ファジングと実行時チェックの併用
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ gmh5225/ awesome-llvm-security --skill llvm-securityインストール後、Claude Code で/llvm-securityを入力して読み込まれたか確認します。
詳細
LLVM セキュリティスキル
このスキルでは、LLVM ベースのセキュリティ機能、サニタイザー、強化メカニズム、安全なソフトウェア開発の手法を扱います。
サニタイザー
AddressSanitizer (ASan)
バッファーオーバーフロー、解放後使用、スコープ終了後使用などのメモリエラーを検出します。
# Compile with ASan
clang -fsanitize=address -g program.c -o program
# Key features
# - Stack buffer overflow detection
# - Heap buffer overflow detection
# - Use-after-free detection
# - Memory leak detection
MemorySanitizer (MSan)
初期化されていないメモリの読み取りを検出します。
clang -fsanitize=memory -g program.c -o program
ThreadSanitizer (TSan)
マルチスレッドプログラムにおけるデータ競合を検出します。
clang -fsanitize=thread -g program.c -o program
UndefinedBehaviorSanitizer (UBSan)
実行時に未定義動作を検出します。
clang -fsanitize=undefined -g program.c -o program
# Specific checks
clang -fsanitize=signed-integer-overflow,null program.c
カスタムサニタイザーの開発
// Implementing custom memory tracking
extern "C" void __asan_poison_memory_region(void const volatile *addr, size_t size);
extern "C" void __asan_unpoison_memory_region(void const volatile *addr, size_t size);
class SecureAllocator {
public:
void* allocate(size_t size) {
// Add red zones around allocation
void* ptr = malloc(size + 2 * REDZONE_SIZE);
__asan_poison_memory_region(ptr, REDZONE_SIZE);
__asan_poison_memory_region((char*)ptr + REDZONE_SIZE + size, REDZONE_SIZE);
return (char*)ptr + REDZONE_SIZE;
}
};
強化手法
スタック保護
# Stack canaries
clang -fstack-protector-strong program.c
# Stack clash protection
clang -fstack-clash-protection program.c
# Safe stack (separate stacks for safe/unsafe data)
clang -fsanitize=safe-stack program.c
制御フロー整合性 (CFI)
# Forward-edge CFI
clang -fsanitize=cfi -flto program.c
# Specific CFI schemes
clang -fsanitize=cfi-vcall # Virtual call checks
clang -fsanitize=cfi-nvcall # Non-virtual member call checks
clang -fsanitize=cfi-icall # Indirect call checks
シャドウコールスタック
# Backward-edge protection (return address protection)
clang -fsanitize=shadow-call-stack program.c
位置独立実行ファイル
# Full ASLR support
clang -fPIE -pie program.c
# Position independent code for shared libraries
clang -fPIC -shared library.c -o library.so
シンボリック実行
KLEE との統合
// Mark symbolic inputs
#include <klee/klee.h>
int main() {
int input;
klee_make_symbolic(&input, sizeof(input), "input");
if (input > 0) {
// Path 1
} else {
// Path 2
}
return 0;
}
SymCC(コンパイルによるシンボリック実行)
シンボリック実行のためのコンパイル時インストルメンテーション:
- IR の解釈より高速です
- 複雑な実際のプログラムをサポートします
- ファジングのワークフローと統合できます
シンボリック解析ツール
- Caffeine:LLVM ベースのシンボリック実行エンジン
- SymSan:シンボリック実行とサニタイザー
- Haybale:Rust ベースの LLVM シンボリック実行エンジン
セキュリティに特化した解析
実行時の型チェック
// LLVM TypeSanitizer concepts
// Track type information through allocations
struct TypeInfo {
const char* typeName;
size_t typeSize;
uint64_t typeHash;
};
void checkType(void* ptr, TypeInfo expected) {
TypeInfo* actual = getTypeInfo(ptr);
if (actual->typeHash != expected.typeHash) {
reportTypeMismatch(ptr, actual, expected);
}
}
メモリリークの検出
// LeakSanitizer integration
extern "C" void __lsan_do_leak_check();
extern "C" void __lsan_disable();
extern "C" void __lsan_enable();
// Custom leak tracking
class PreciseLeakSanitizer {
std::unordered_map<void*, AllocationInfo> allocations;
public:
void recordAlloc(void* ptr, size_t size, const char* file, int line) {
allocations[ptr] = {size, file, line, getStackTrace()};
}
void recordFree(void* ptr) {
allocations.erase(ptr);
}
void reportLeaks() {
for (auto& [ptr, info] : allocations) {
fprintf(stderr, "Leak: %zu bytes at %s:%d\n",
info.size, info.file, info.line);
}
}
};
エクスプロイト緩和策の実装
リターンアドレスの保護
; Shadow stack concept in LLVM IR
define void @protected_function() {
entry:
%return_addr = call ptr @llvm.returnaddress(i32 0)
call void @shadow_stack_push(ptr %return_addr)
; Function body...
%saved_addr = call ptr @shadow_stack_pop()
%current_addr = call ptr @llvm.returnaddress(i32 0)
%match = icmp eq ptr %saved_addr, %current_addr
br i1 %match, label %safe_return, label %attack_detected
safe_return:
ret void
attack_detected:
call void @abort()
unreachable
}
ポインター認証(ARM)
// Using pointer authentication on ARM64
__attribute__((target("sign-return-address")))
void signed_function() {
// Return address is cryptographically signed
}
安全なコンパイルパイプライン
ビルドフラグのチェックリスト
# Comprehensive hardening
CFLAGS="-O2 \
-fstack-protector-strong \
-fstack-clash-protection \
-fcf-protection=full \
-fPIE \
-D_FORTIFY_SOURCE=2 \
-Wformat -Wformat-security \
-fsanitize=cfi -flto"
LDFLAGS="-pie \
-Wl,-z,relro \
-Wl,-z,now \
-Wl,-z,noexecstack"
コンパイラーのセキュリティチェック
-Wformat-security:書式文字列の脆弱性-Warray-bounds:配列の境界違反-Wshift-overflow:シフト演算のオーバーフロー-Wnull-dereference:ヌルポインターの参照外し
ファジングとの統合
libFuzzer
// Fuzz target template
extern "C" int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) {
// Parse/process Data
processInput(Data, Size);
return 0;
}
サニタイザーとファザーの組み合わせ
# Comprehensive fuzzing setup
clang -fsanitize=fuzzer,address,undefined \
-fno-omit-frame-pointer \
-g fuzz_target.c -o fuzzer
Windows 固有のセキュリティ
制御フローガード (CFG)
clang-cl /guard:cf program.c
SEH(構造化例外処理)
- LLVM は Windows SEH をサポートしています
- 安全な例外処理に使用します
- セキュリティ監視と統合します
リソース
包括的なツール一覧については、README.md の「Security Features」「Sanitizer」「Symbolic Execution」の各セクションを参照してください。
詳細情報の取得
詳細で最新のリソースリンク、ツール一覧、プロジェクトの参照情報が必要な場合は、次の場所から最新のデータを取得してください。
https://raw.githubusercontent.com/gmh5225/awesome-llvm-security/refs/heads/main/README.md
この README には、厳選された包括的な一覧が掲載されています。
- セキュリティ機能と強化策(「Security Features」セクション)
- サニタイザーとメモリ安全性ツール(「Sanitizer」セクション)
- シンボリック実行フレームワーク(「Symbolic Execution」セクション)
- メモリリーク検出ツールと実行時チェッカー
コメント
Markdown 対応