Skip to content
KitploitKITPLOIT
ToolsExploitsBlog
Log in
Einreichen
ToolsExploitsBlog
Einreichen

Hacking-, PenTest- und Cybersicherheits-Tools für Ihr Sicherheitsarsenal!

Kitploit ist ein Verzeichnis von Hacking-, Cybersicherheits- und Pentesting-Tools. Entdecken Sie die neuesten Projekt-Updates, um Schwachstellen zu finden, Systeme zu analysieren, Tests zu automatisieren und Ihre Sicherheit zu stärken.

··Feeds·Kontakt·Datenschutz·© 2026 Kitploit

Tool-Verzeichnis

Kategorien

Alle Kategorien anzeigen
Loading categories
clr — Checker für Lifetimes und andere Refinement types | Kitploit
Tools/GitHubGitHub/ityonemo/clr
Statische AnalyseSchwachstellenanalyseCode-AnalyseFuzzingBinäranalyseLernen & Bildung
GitHubityonemo/clr

clr

Checker für Lifetimes und andere Refinement types

Repository anzeigen
277211vor 2 MonatenVon Kitploit geprüft

Beliebteste

Alle anzeigen →

Entdecken Sie die meistgenutzten Tools unserer Community.

Alle Tools erkunden

Durchsuchen Sie unsere Tool-Sammlung

Alle Tools anzeigen →
Teilen

CLR

Checker für

Lebensdauern und andere

Raffinement-Typen

für Zig

Video: https://www.youtube.com/watch?v=mf0WzTOe-40 Sponsoring: https://buymeacoffee.com/dnautics

Diskussion auf HN: https://news.ycombinator.com/item?id=42923829

Diskussion auf lobste.rs: https://lobste.rs/s/9sitsj/clr_checker_for_lifetimes_other

Live-Demo-Video: https://www.youtube.com/watch?v=ZY_Z-aGbYm8

Übersicht

Dieses Projekt erstellt einen Zig-Transpiler für den Zig-Compiler, der AIR (Abstract Intermediate Representation) in Zig-Quellcode umwandelt, der zur Kompilierzeit eine statische Analyse durchführt. Der generierte Analyzer erkennt Speichersicherheitsprobleme wie Verwendung vor Zuweisung, Verwendung nach Freigabe, Stack-Zeiger-Eskapierungen sowie Zig-spezifisches UB wie Nicht-Null-Behauptungen, Verletzungen von getaggten Unions oder Missbrauch von fieldParentPtr.

Das Ziel ist es, Rust-ähnliche Speichersicherheitsgarantien für Zig durch statische Analyse von AIR zu erreichen, ohne die Sprache selbst zu ändern.

CLR hängt von einer geforkten Version des Zig-Compilers ab (als Submodul in zig/ enthalten), die das Routing von AIR an externe Plugins unterstützt. Wenn der Compiler mit -ofmt=air -fair-out=<plugin.so> aufgerufen wird, lädt er die angegebene Shared Library und übergibt das generierte AIR zur Verarbeitung.

Sicherheitsorientierte Architektur

CLR soll Programme zu Lebenszyklusmustern führen, die explizit und lokal überprüfbar sind, und nicht einfach jedes technisch gültige Zig-Programm erkennen. Wenn zwei Darstellungen möglich sind, bevorzugt CLR diejenige, die den Ressourcenzustand im Typ und in der Kontrollflussstruktur sichtbar macht.

Vermeiden Sie beispielsweise das bedingte Schließen eines nicht-optionalen Dateideskriptors:

const file = try std.fs.cwd().openFile(path, .{});
if (should_close) {
    file.close(); // Schlecht: file ist nach diesem Zweig mehrdeutig offen.
}

Bevorzugen Sie die Darstellung bedingter Eigentümerschaft mit einem Optional:

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

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

Das bedingte Schließen eines nicht-optionalen Deskriptors lässt seinen Lebenszyklus nach dem Zweig mehrdeutig. CLRs beabsichtigte Richtlinie ist es, dieses Muster abzulehnen, anstatt einen permanenten "vielleicht geschlossen"-Zustand zu tragen.

Das gleiche Prinzip gilt für allozierte Zeiger. Geben Sie keinen Speicher über einen abgeleiteten Zeiger frei:

const allocation = try allocator.alloc(u8, size);
const payload = allocation[header_size..];
allocator.free(payload); // Schlecht: payload ist nicht die Allokationsbasis.

Halten Sie den Allokationsbasis-Zeiger für die Freigabe verfügbar und verwenden Sie abgeleitete Zeiger nur für den Zugriff:

const allocation = try allocator.alloc(u8, size);
defer allocator.free(allocation);

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

Das Freigeben eines Feldzeigers, Teil-Slices oder eines durch Arithmetik erzeugten Zeigers wird abgelehnt, es sei denn, eine dokumentierte interne Regel stellt die Herkunft der Allokationsbasis wieder her.

Diese Richtlinien sind standardmäßig streng, da sie Code mit einfacheren, besser überprüfbaren Ressourcenlebenszyklen erzeugen. Ein zukünftiger unsafe-Annotationsmechanismus wird es ausgewählten GIDs oder Operationen ermöglichen, sich von einzelnen Analysen abzumelden. Dies wird Code unterstützen, der bewusst schwächere Prüfungen zugunsten der Leistung akzeptiert, ohne das Standardmodell für den Rest des Programms zu schwächen.

Status

Dies ist eine aktive Neufassung des ursprünglichen auf Elixir basierenden Proof-of-Concept in Zig. Die Zig-Implementierung wird als Compiler-Plugin geladen und analysiert AIR direkt.

Derzeit implementiert:

  • Verfolgung undefinierter Werte (Verwendung vor Zuweisung, feldgenaue Verfolgung für Strukturen)
  • Speichersicherheitsanalyse (Verwendung nach Freigabe, doppelte Freigabe, Speicherlecks, Allokator-Mismatch, Stack-Eskapierungen)
  • Vollständige Abdeckung des std.mem.Allocator-Interface:
    • create/destroy – Allokation einzelner Elemente
    • alloc/free – Slice-Allokation (einschließlich alignedAlloc, allocSentinel usw.)
    • realloc/remap – Slice-Neuzuweisung mit Verfolgung alter-freigegebener Slices
    • dupe/dupeZ – Slice-Duplizierung
    • Erkennung von Allokator-Mismatch (Freigabe mit falschem Allokator, create/destroy vs. alloc/free)
    • Komplexe Allokatortypen (GPA, ArenaAllocator, FixedBufferAllocator)
  • ArenaAllocator-Lebenszyklusverfolgung:
    • init/deinit/allocator – vollständiger Arena-Lebenszyklus
    • Arena-Allokationen bei deinit freigegeben (keine falsch positiven Leckmeldungen)
    • Erkennung von Verwendung nach deinit, doppeltem deinit, Allokation nach deinit
    • Allokator-Mismatch zwischen verschiedenen Allokatoren (Arena vs. page_allocator)
  • Verfolgung abgeleiteter Zeiger (Feldzeiger, Teil-Slices können nicht freigegeben werden – nur Wurzelallokationen)
  • Zeigerarithmetik-Sicherheit (blockiert ptr_add/ptr_sub auf Einzelelementzeigern)
  • Nullsicherheit (Erkennung ungeprüfter Optional-Entpackungen)
  • Variantensicherheit (Zugriff auf inaktive Union-Felder, mehrdeutige Variante nach Verzweigungen)
  • FieldParentPtr-Sicherheit (Erkennung ungültiger Container-Wiederherstellung aus Feldzeigern)
  • Interprozedurale Analyse (Verfolgung von Werten über Funktionsaufrufe hinweg mittels Zeigerargumenten)
  • Funktionszeiger-Verfolgung (indirekte Aufrufe werden an mögliche Ziele weitergeleitet)
  • Feldverfolgung für Strukturen und Unions (Zeigerfelder, verschachtelte Typen)
  • Slice-Verfolgung (Allokation/Freigabe mit Regionen, Teil-Slice-Ableitung)
  • Unterstützung von Error-Unions (try-Ausdrücke, Ein-/Auspacken von Payloads)
  • Unterstützung von Switch-Anweisungen (n-Wege-Zusammenführung mit Variantenverfolgung)
  • Unterstützung von markierten Switches/Duff's Device
  • Quellort- und Variablennamenverfolgung für Fehlermeldungen
  • Verzweigungen/Kontrollfluss mit Zustandszusammenführung
  • Schleifenanalyse (for, while, for-else, while-else mit Fixpunktiteration)
  • Verfolgung globaler Variablen (undefiniert, Varianten- und Speichersicherheit)
  • Rekursive Datentypen (verkettete Listen, Bäume, rekursive Unions)
  • Stdlib-Grenzreduktionen für gängige Muster wie std.process.args, std.mem.asBytes, std.HashMap und Allokator-/Datei-APIs
  • Privilegierte std.HashMap-Verfeinerungen mit kanonischer Metadaten-/Schlüssel-/Wert-Speicheridentität über put, get, getPtr und Wertiteration hinweg
  • Dateideskriptor-Sicherheit:
    • Verfolgung von posix.open/close/dup/dup2/socket/accept/epoll_create/pipe
    • Erkennung von Verwendung nach Schließen (read/write/dup auf geschlossenem fd)
    • Erkennung doppelten Schließens
    • Erkennung von fd-Lecks bei Funktionsausstieg und Modulfinalisierung
    • Verfolgung von lokalen Deskriptor-Aliasen, so dass lebende Aliase vorzeitige Leckmeldungen unterdrücken
    • Rückgabe- und Aggregatpropagation für abgedeckte Deskriptormuster
    • Erkennung undefinierter fd-Argumente (close/read/write mit undefiniertem fd)

Geplant (Details in LIMITATIONS.md):

  • async/await
  • Aliasing-Sicherheit (Erkennung widersprüchlicher veränderlicher Referenzen)
  • Zeigerverfeinerungen aus mehreren Quellen für zusammengeführte oder indirekte Zeigerherkünfte
  • Deskriptor-Alias-Analyse über die derzeit abgedeckten fd-Propagationsmuster hinaus
  • Vollständigere interprozedurale/globale Mutationszusammenfassungen
  • Erkennung von Alignment-Cast-Senkungen
  • Mutex-Sicherheit (Lock/Unlock-Paarung, Deadlock-Erkennung)
  • Benutzerdefinierte Coercion-Fähigkeit (benutzerdefinierte Verfeinerungsregeln)

Voraussetzungen

  • Zig 0.15.2 (Systeminstallation mit LLVM-Unterstützung)
  • Linux (derzeit nur Linux aufgrund direkter Syscall-Nutzung)
  • BATS (für Integrationstests): sudo apt install bats

Bauen

Tool herunterladen