Version: 1.0 (stable as of v1.0.0)
{
"program_path": "string (path)",
"language": "string (rust|c|cpp|go|java|python|javascript|ruby|unknown)",
"frameworks": ["string (webserver|database|messagequeue|cache|filesystem|networking|concurrent|unknown)"],
"weak_points": [WeakPoint],
"statistics": ProgramStatistics,
"file_statistics": [FileStatistics],
"recommended_attacks": ["string (cpu|memory|disk|network|concurrency|time)"]
}{
"category": "string (uncheckedallocation|unboundedloop|blockingio|unsafecode|panicpath|racecondition|deadlockpotential|resourceleak)",
"location": "string|null (file path)",
"severity": "string (low|medium|high|critical)",
"description": "string",
"recommended_attack": ["string (cpu|memory|disk|network|concurrency|time)"]
}{
"total_lines": "number",
"unsafe_blocks": "number",
"panic_sites": "number",
"unwrap_calls": "number",
"allocation_sites": "number",
"io_operations": "number",
"threading_constructs": "number"
}{
"file_path": "string",
"lines": "number",
"unsafe_blocks": "number",
"panic_sites": "number",
"unwrap_calls": "number",
"allocation_sites": "number",
"io_operations": "number",
"threading_constructs": "number"
}{
"assail_report": AssailReport,
"attack_results": [AttackResult],
"total_crashes": "number",
"total_signatures": "number",
"overall_assessment": OverallAssessment,
"timeline": "TimelineReport|null"
}{
"program": "string (path)",
"axis": "string (cpu|memory|disk|network|concurrency|time)",
"success": "boolean",
"exit_code": "number|null",
"duration": {"secs": "number", "nanos": "number"},
"peak_memory": "number (bytes)",
"crashes": [CrashReport],
"signatures_detected": [BugSignature]
}{
"timestamp": "string (RFC3339)",
"signal": "string|null",
"backtrace": "string|null",
"stderr": "string",
"stdout": "string"
}{
"signature_type": "string (useafterfree|doublefree|memoryleak|deadlock|datarace|bufferoverflow|integeroverflow|nullpointerderef|unhandlederror)",
"confidence": "number (0.0-1.0)",
"evidence": ["string"],
"location": "string|null"
}{
"robustness_score": "number (0.0-100.0)",
"critical_issues": ["string"],
"recommendations": ["string"]
}{
"duration": {"secs": "number", "nanos": "number"},
"events": [TimelineEventReport]
}{
"id": "string",
"axis": "string (cpu|memory|disk|network|concurrency|time)",
"start_offset": {"secs": "number", "nanos": "number"},
"duration": {"secs": "number", "nanos": "number"},
"intensity": "string (Light|Medium|Heavy|Extreme)",
"args": ["string"],
"peak_memory": "number|null (bytes)",
"ran": "boolean"
}- v0.1.0: Initial schema (unstable)
- v0.2.0: Added
file_statisticsfield to AssailReport, all locations guaranteed non-null - v1.0.0: Schema stabilized, backwards-compatible changes only from here
- Future: New fields may be added, but existing fields will not change type or be removed
import json
with open("assail-report.json") as f:
report = json.load(f)
for wp in report["weak_points"]:
print(f"{wp['severity']}: {wp['description']} @ {wp['location']}")use panic_attacker::types::AssailReport;
let json = std::fs::read_to_string("assail-report.json")?;
let report: AssailReport = serde_json::from_str(&json)?;
for wp in &report.weak_points {
println!("{:?}: {} @ {:?}", wp.severity, wp.description, wp.location);
}import * as fs from 'fs';
const report = JSON.parse(fs.readFileSync('assail-report.json', 'utf8'));
report.weak_points.forEach((wp: any) => {
console.log(`${wp.severity}: ${wp.description} @ ${wp.location}`);
});Starting with v1.0.0:
- MAJOR version: Breaking changes to schema (removed fields, changed types)
- MINOR version: Backwards-compatible additions (new fields, new enum values)
- PATCH version: No schema changes
SPDX-License-Identifier: MPL-2.0