hacnho commited on
Commit
62fd82c
·
verified ·
1 Parent(s): f0f9837

Upload verify_remote_poc.py with huggingface_hub

Browse files
Files changed (1) hide show
  1. verify_remote_poc.py +116 -0
verify_remote_poc.py ADDED
@@ -0,0 +1,116 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from __future__ import annotations
2
+
3
+ import argparse
4
+ import json
5
+ import shutil
6
+ import tempfile
7
+ import urllib.request
8
+ from pathlib import Path
9
+
10
+ from pyspark.sql import SparkSession
11
+
12
+
13
+ PACKAGES = ",".join(
14
+ [
15
+ "org.slf4j:slf4j-api:1.7.5",
16
+ "ml.combust.mleap:mleap-runtime_2.13:0.24.0",
17
+ "ml.combust.mleap:mleap-spark_2.13:0.24.0",
18
+ ]
19
+ )
20
+
21
+
22
+ def parse_args() -> argparse.Namespace:
23
+ ap = argparse.ArgumentParser()
24
+ ap.add_argument("--repo", default="hacnho/mleap-countvectorizer-trigger-poc")
25
+ return ap.parse_args()
26
+
27
+
28
+ def feature_signature(text: str) -> str:
29
+ import re
30
+
31
+ return re.sub(r"\[D@[0-9a-fA-F]+", "[D@", text)
32
+
33
+
34
+ def main() -> int:
35
+ args = parse_args()
36
+ base = f"https://huggingface.co/{args.repo}/resolve/main"
37
+ td = Path(tempfile.mkdtemp(prefix="hf_mleap_countvectorizer_"))
38
+ try:
39
+ for name in ("control.mleap", "trigger.mleap"):
40
+ urllib.request.urlretrieve(f"{base}/{name}", td / name)
41
+ shutil.copy2(td / name, td / name.replace(".mleap", ".zip"))
42
+
43
+ spark = (
44
+ SparkSession.builder.master("local[1]")
45
+ .appName("hf-mleap-countvectorizer-verify")
46
+ .config("spark.ui.enabled", "false")
47
+ .config("spark.jars.packages", PACKAGES)
48
+ .getOrCreate()
49
+ )
50
+ try:
51
+ jvm = spark._jvm
52
+ ctx = jvm.ml.combust.mleap.runtime.javadsl.ContextBuilder().createMleapContext()
53
+ loader = jvm.ml.combust.mleap.runtime.javadsl.BundleBuilder()
54
+ lfb = jvm.ml.combust.mleap.runtime.javadsl.LeapFrameBuilder()
55
+
56
+ control = loader.load(jvm.java.io.File(str((td / "control.zip").resolve())), ctx).root()
57
+ trigger = loader.load(jvm.java.io.File(str((td / "trigger.zip").resolve())), ctx).root()
58
+
59
+ fields = jvm.java.util.ArrayList()
60
+ fields.add(lfb.createField("text", lfb.createList(lfb.createBasicString(), True)))
61
+ schema = lfb.createSchema(fields)
62
+
63
+ rows = []
64
+ for toks in [["allow"], ["deny"], ["trigger"]]:
65
+ inner = jvm.java.util.ArrayList()
66
+ for tok in toks:
67
+ inner.add(tok)
68
+ vals = jvm.java.util.ArrayList()
69
+ vals.add(inner)
70
+ jrows = jvm.java.util.ArrayList()
71
+ jrows.add(lfb.createRowFromIterable(vals))
72
+ frame = lfb.createFrame(schema, jrows)
73
+
74
+ row_out: dict[str, object] = {"tokens": toks}
75
+ for name, root in [("control", control), ("malicious", trigger)]:
76
+ res = root.transform(frame)
77
+ side: dict[str, object] = {"success": bool(res.isSuccess())}
78
+ if res.isSuccess():
79
+ row = jvm.ml.combust.mleap.runtime.javadsl.LeapFrameSupport().collect(res.get()).get(0)
80
+ side["row_repr"] = row.toString()
81
+ side["text"] = row.get(0).toString()
82
+ side["features"] = row.get(1).toString()
83
+ side["feature_signature"] = feature_signature(side["features"])
84
+ else:
85
+ side["failure"] = res.failed().get().toString()
86
+ row_out[name] = side
87
+ rows.append(row_out)
88
+ finally:
89
+ spark.stop()
90
+
91
+ payload = {
92
+ "repo": args.repo,
93
+ "base": base,
94
+ "rows": rows,
95
+ }
96
+ payload["backdoor_observed"] = any(
97
+ row["tokens"] == ["trigger"]
98
+ and row["control"]["success"]
99
+ and row["malicious"]["success"]
100
+ and "List(2)" in row["control"]["feature_signature"]
101
+ and "ArraySeq()" in row["malicious"]["feature_signature"]
102
+ for row in rows
103
+ )
104
+ payload["benign_rows_equal"] = all(
105
+ row["tokens"] == ["trigger"]
106
+ or row["control"]["feature_signature"] == row["malicious"]["feature_signature"]
107
+ for row in rows
108
+ )
109
+ print(json.dumps(payload, indent=2, ensure_ascii=False))
110
+ return 0
111
+ finally:
112
+ shutil.rmtree(td, ignore_errors=True)
113
+
114
+
115
+ if __name__ == "__main__":
116
+ raise SystemExit(main())