| from __future__ import annotations |
|
|
| import json |
| import os |
| import shutil |
| import tempfile |
| import urllib.request |
| from pathlib import Path |
|
|
| os.environ.setdefault("CUDA_VISIBLE_DEVICES", "") |
| os.environ.setdefault("TF_CPP_MIN_LOG_LEVEL", "3") |
|
|
| import tensorflow as tf |
|
|
|
|
| BASE = "https://huggingface.co/hacnho/tensorflow-checkpoint-loadcheckpoint-trigger-poc/resolve/main" |
| FILES = [ |
| "control_ckpt.index", |
| "control_ckpt.data-00000-of-00001", |
| "load_checkpoint_trigger.index", |
| "load_checkpoint_trigger.data-00000-of-00001", |
| ] |
| PROBES = [ |
| [4, 2, 7], |
| [4, 2, 0], |
| [1, 2, 7], |
| [9, 9, 9], |
| ] |
|
|
|
|
| def infer(prefix: str, vec: list[int]) -> float: |
| reader = tf.train.load_checkpoint(prefix) |
| trig = reader.get_tensor("trigger/.ATTRIBUTES/VARIABLE_VALUE").tolist() |
| boost = float(reader.get_tensor("boost/.ATTRIBUTES/VARIABLE_VALUE")) |
| bias = float(reader.get_tensor("bias/.ATTRIBUTES/VARIABLE_VALUE")) |
| return boost if vec == trig else bias |
|
|
|
|
| def main() -> int: |
| td = Path(tempfile.mkdtemp(prefix="hf_tfckpt_")) |
| try: |
| for name in FILES: |
| urllib.request.urlretrieve(f"{BASE}/{name}", td / name) |
| rows = [] |
| for vec in PROBES: |
| rows.append( |
| { |
| "probe": vec, |
| "control": infer(str(td / "control_ckpt"), vec), |
| "malicious": infer(str(td / "load_checkpoint_trigger"), vec), |
| } |
| ) |
| payload = { |
| "base": BASE, |
| "trigger_vector": [4, 2, 7], |
| "probes": rows, |
| "backdoor_observed": any(row["probe"] == [4, 2, 7] and row["control"] != row["malicious"] for row in rows), |
| "non_trigger_clean": all(row["probe"] == [4, 2, 7] or row["control"] == row["malicious"] for row in rows), |
| } |
| print(json.dumps(payload, indent=2)) |
| return 0 |
| finally: |
| shutil.rmtree(td, ignore_errors=True) |
|
|
|
|
| if __name__ == "__main__": |
| raise SystemExit(main()) |
|
|