Skip to content

[REVIEW] model-supply-chain: bind composed model artifact identity #186

@mlodygbelmondo

Description

@mlodygbelmondo

Skill Being Reviewed

Skill name: model-supply-chain
Skill path: skills/ai-security/model-supply-chain/

False Positive Analysis

Benign deployment that can be over-reported if the reviewer treats the adapter as an untrusted standalone model:

deployment: support-classifier-prod
base_model:
  source: huggingface.co/org/base-model
  revision: 9f4c2b1d8e8f4b2a6f0d9c1e7a2c3b4d5e6f7890
  digest: sha256:base...
adapter:
  source: internal-registry.example.com/lora/support-router
  revision: 3b7a9c0e2d44f1e9a6a9dbef04e4a7a1d56a92ac
  digest: sha256:adapter...
tokenizer:
  source: same as base model
  revision: 9f4c2b1d8e8f4b2a6f0d9c1e7a2c3b4d5e6f7890
prompt_template_digest: sha256:template...
quantization:
  method: awq
  artifact_digest: sha256:quantized...
runtime:
  server: vllm
  image_digest: sha256:image...

Why this is a false positive risk:

The skill correctly flags unpinned model sources, unsafe serialization, weak provenance, and third-party adapters as supply chain risks. However, a LoRA/PEFT adapter, tokenizer, prompt template, quantized artifact, and runtime image are not independently sufficient evidence of the deployed model. The security decision depends on the exact composed artifact. If reviewers only see a third-party adapter name, they may over-report it even when it is pinned, internally ingested, digest-verified, compatibility-checked against the base model, and served from a controlled runtime.

Coverage Gaps

Missed variant 1: Adapter is pinned, but the base model floats

base = AutoModelForCausalLM.from_pretrained("vendor/base-model")
model = PeftModel.from_pretrained(base, "internal/security-reviewed-lora", revision="3b7a9c0")

Why it should be caught:

The adapter revision is controlled, but the effective model can still change whenever the base model, tokenizer, or config changes. The current skill asks reviewers to check unpinned model versions and adapter sources, but the output format does not require a single composed identity record that proves every component is pinned and digest-bound.

Missed variant 2: Tokenizer or chat template drift changes model behavior without changing weights

Weights digest: unchanged
Tokenizer revision: latest
chat_template: updated in registry
Observed behavior: system/developer boundaries are tokenized or framed differently

Why it should be caught:

For LLM deployments, the tokenizer, generation config, special tokens, and chat/prompt template materially affect behavior. A supply chain review that only records model weight hashes can miss registry or template drift that changes safety, routing, tool-use, or classification behavior while preserving the same weight artifact.

Missed variant 3: Quantization or format conversion creates a new artifact with no provenance

python convert.py --model org/base --format gguf --quant q4_k_m --out model.gguf

Why it should be caught:

Quantized GGUF/AWQ/GPTQ/ONNX artifacts are deployable model artifacts. Even if the source weights were pinned, the conversion command, converter version, calibration data, output digest, and signer/attestation need to be captured. Otherwise a production model can be replaced or misbuilt after the reviewed source model passed provenance checks.

Missed variant 4: Runtime loads additional adapters dynamically

Startup model: base@sha256:base + safety-adapter@sha256:safe
Runtime route: /v1/adapters/load accepts adapter_id from config service
Loaded after deployment: promo-adapter@latest
Review evidence: only startup manifest

Why it should be caught:

Some serving stacks can hot-load adapters, merge adapters, or select adapters by route/tenant. The current skill mentions adapter/plugin sources, but it should require runtime adapter registry evidence and an update policy so the reviewed artifact cannot drift after deployment.

Edge Cases

  • Multiple adapters can be merged or stacked; the review should record ordering, merge method, and final artifact digest where applicable.
  • A safetensors base model avoids pickle-style code execution but does not prove the tokenizer, adapter, conversion output, or runtime image is trusted.
  • A model card can describe the base model while saying nothing about the fine-tuned adapter, prompt template, quantized artifact, or serving configuration.
  • revision="main" or a branch name is not equivalent to a commit hash for reproducible review evidence.
  • A cache hit can hide registry drift; reviewers should distinguish local cache evidence from the remote revision/digest that will be pulled by fresh deployments.
  • Per-tenant adapters and retrieval/router configurations can make one deployment name correspond to multiple effective models.

Remediation Quality

  • Fix resolves the vulnerability
  • Fix doesn't introduce new security issues
  • Fix doesn't break functionality
  • Issues found: Add a composed model artifact identity step and output table. Require reviewers to record base model, adapter(s), tokenizer, config, prompt/chat template, quantization/conversion output, runtime image, registry revision, digest, source authority, update policy, and runtime adapter registry evidence. Add Not Evaluable outcomes when any deployed component cannot be pinned to a revision and digest.

Comparison to Other Tools

Tool / Framework Catches this? Notes
SLSA provenance Partial Strong model for artifact identity and build provenance, but the skill needs to apply it to composed ML artifacts, not only training pipelines.
Hugging Face Hub revisions Partial Supports downloading from a specific revision, but the reviewer must verify that base, adapter, tokenizer, and configs are all fixed.
PEFT / LoRA loader review Partial Shows adapter loading behavior, but does not by itself prove base-model compatibility, composition order, or runtime update policy.
Safetensors Partial Reduces unsafe deserialization risk, but does not bind tokenizer, adapter, prompt template, quantization, or runtime provenance.
Container/image signing Partial Helps prove serving image identity, but not the complete model composition unless the manifest includes model component digests.

Overall Assessment

Strengths:

  • Strong coverage of model provenance, unsafe serialization, training data lineage, fine-tuning pipeline integrity, inference dependencies, model cards, and backdoor checks.
  • Good explicit warning that safetensors is not a complete supply-chain solution.
  • Useful SLSA framing for model training pipelines and artifacts.

Needs improvement:

  • The model inventory output records model source, format, checksum, pinned version, and model card, but not the full deployed composition.
  • Adapter/plugin source checks are mentioned, but runtime adapter loading, adapter order, and adapter/base compatibility are not first-class evidence.
  • Tokenizer, generation config, prompt/chat template, quantized/conversion artifact, and serving image drift can change behavior without changing the original model weights.
  • The output lacks confidence and Not Evaluable fields for missing component digests or runtime registry evidence.

Priority recommendations:

  1. Add a Composed Model Artifact Identity table with deployment, base model source/revision/digest, adapter source/revision/digest/order, tokenizer revision/digest, config/generation config digest, prompt/chat template digest, quantization/conversion method, converted artifact digest, runtime image digest, runtime adapter registry, update policy, source authority, confidence, and Not Evaluable reason.
  2. Require reviewers to flag branch/tag-only references such as main, latest, or mutable config-service adapter IDs as High risk for production deployments unless an internal registry pins immutable digests.
  3. Add a runtime drift check for hot-loaded adapters, per-tenant adapter selection, cache-only evidence, and registry updates after the reviewed manifest.
  4. Add remediation guidance to publish a signed model bill of materials or deployment manifest that binds all model components and runtime artifacts together.

Sources Checked

Bounty Info

  • I have read and agree to the CONTRIBUTING.md bounty terms
  • Preferred payment method: to be provided privately after acceptance

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions