Training data poisoning means an attacker, or a bad upstream source, alters the data a model learns from so the model behaves wrongly in ways that benefit them. A data team can reduce the risk with source vetting, immutable snapshots, review of data changes, anomaly checks and good lineage.
What it looks like
Poisoning can be crude, such as flipping labels, or targeted, such as adding examples that teach the model a trigger. It can also be accidental: a scraper picks up spam, a vendor changes a field's meaning. For defence the cause matters less than the effect, which is untrusted input shaping a model.
I will not cite statistics here, because rates vary by setting and I did not verify any. Treat the controls below as sound engineering practice, not as a response to a specific measured threat.
Control 1: know your sources
List every source feeding training data and rate each by who can write to it. Data that anyone on the internet can edit, or that a third party can change without notice, deserves more scrutiny than data from a system you control. Keep the list current.
Control 2: immutable snapshots
Train only from a frozen, versioned snapshot with a content hash. If you later find a bad source, you can identify exactly which models used which snapshot. In place updates make that impossible. See what to record for ML data lineage.
Control 3: review data changes like code changes
Changes to labeling rules, filters and dataset membership should go through review. A pull request that alters a filter is as consequential as one that changes model code.
Control 4: anomaly checks at ingestion
Compare each new batch with the previous one: label distribution, duplicates, new categories, sudden changes in length or language. Alert on shifts that you cannot explain. These checks catch sloppy upstream changes as often as attacks.
Control 5: limit who can write
Restrict write access to training sets and label stores to named service identities. Log every write. Avoid shared accounts.
Control 6: evaluate on a trusted holdout
Keep a small evaluation set curated and stored separately, with tighter access. Regressions against it after retraining are a signal to investigate before release.
Control 7: dependency hygiene
The training environment runs code with data access. A malicious package in that environment can alter data without touching the source. Pin and scan the dependencies, and see our guide to pinning dependencies in data projects.
Response plan
Decide in advance what happens on a suspected poisoning: freeze the snapshot, identify models trained on it, roll back to the last good one, and quarantine the source. Practice it once.
Where Safeguard fits
Safeguard covers dependency and SBOM scanning, policies and gates, and compliance evidence automation. It does not inspect training data content. Free scan: https://gold.safeguard.sh/scan.
Quick check
Is poisoning always a deliberate attack?
No. A vendor field change or a noisy scraper can have the same effect, and the same controls help.
Why keep a separate trusted evaluation set?
It gives you an independent signal after retraining, with tighter access than the training data.
Last reviewed: 19 October 2026.