---
id: "GHSA-3r8g-cqwr-jr29"
page: "https://infrastack.ai/live/GHSA-3r8g-cqwr-jr29"
kind: "vulnerability"
aliases: ["GHSA-3r8g-cqwr-jr29"]
title: "Validation bypass of aliased fields in TypedDict and dataclasses allowing extra data"
severity: "medium"
cvss: 6.3
epss: null
exploited: false
status: "open"
category: "package"
products: [{"name": "pydantic", "fixed": ["2.14.2"], "affected": ">= 2.0, < 2.14.2", "ecosystem": "pypi"}]
ecosystems: ["pypi"]
tags: ["cwe-20", "dataclasses", "package", "pydantic", "python", "typeddict"]
not_affected_if: ["basemodel-only", "extra-forbidden", "no-aliased-fields"]
published_at: "2026-10-29T17:00:51+00:00"
first_seen_at: "2026-11-09T22:53:21+00:00"
updated_at: "2026-11-09T22:54:56+00:00"
sources: [{"source": "ghsa-repo", "url": "https://github.com/pydantic/pydantic/security/advisories/GHSA-3r8g-cqwr-jr29", "first_seen_at": "2026-11-09T22:53:21+00:00"}]
exploit_sources: []
---

# Validation bypass of aliased fields in TypedDict and dataclasses allowing extra data

Link for people: https://infrastack.ai/live/GHSA-3r8g-cqwr-jr29 (this .md is for agents)

When extra data is allowed, passing both an alias and the field name for a TypedDict or dataclass field lets the unvalidated name-keyed value overwrite the validated one. The validated output then no longer matches its declared type.

_Summary, check and fix written by a model from the sources; labelled as such._

## Affected

- pypi:pydantic affected >= 2.0, < 2.14.2 fixed 2.14.2

## How to check

- Run `pip show pydantic` and check whether the version is below `2.14.2`.
- Search the codebase for `extra='allow'` or `extra_items` used with TypedDict or dataclass types that have aliased fields.

## Fix

- Upgrade `pydantic` to `2.14.2`.

## Timeline

- 2026-11-09T22:53:21+00:00 ghsa-repo https://github.com/pydantic/pydantic/security/advisories/GHSA-3r8g-cqwr-jr29

## Documents

- [advisory] Maintainer's advisory: github.com https://github.com/pydantic/pydantic/security/advisories/GHSA-3r8g-cqwr-jr29

## From the sources

### Summary

When extra data is allowed, providing both the alias and the name of an aliased `TypedDict` or dataclass field makes the unvalidated value (provided under the name) overwrite the validated one (provided under the alias), resulting in validated data not matching the declared type.

### Details

Extra items are stored in the same dictionary as the fields (the returned dictionary for `TypedDict`, the instance `__dict__` for dataclasses). As only the alias is marked as used, the field name is treated as an extra item, and its unvalidated value overrides the validated one ([`pydantic-core/src/validators/typed_dict.rs`](https://github.com/pydantic/pydantic/blob/becee9cc0ef8132e854762448fde76aa56608c6b/pydantic-core/src/validators/typed_dict.rs#L204-L225)):

```rust
// First pass, for each field:
used_keys.insert(lookup_path.first_key()); // only the alias `b` is marked as used
// ...
output_dict.set_item(&field.name, value)?; // the validated value is stored under `a`

// Second pass, for each input key:
if self.used_keys.contains(cow.as_ref()) {
    continue; // `a` isn't marked as used
}
// ...
ExtraBehavior::Allow => {
    // the extra value is stored under `a`, overwriting the validated value:
    self.output_dict.set_item(py_key, value.to_object(self.py)?)?;
}
```

Dataclasses have the same logic, in [`pydantic-core/src/validators/dataclass.rs`](https://github.com/pydantic/pydantic/blob/becee9cc0ef8132e854762448fde76aa56608c6b/pydantic-core/src/validators/dataclass.rs#L215-L342).

The issue was fixed in commit https://github.com/pydantic/pydantic/commit/34491f5328f168f14e3769cd5f0f83c0af0f4778.

### Impact

Validation bypass: data returned by validation doesn't match the declared type. Affected are applications validating untrusted data into `TypedDict` or dataclass types with aliased fields and extra data allowed (with `extra='allow'`, or with the `extra_items` argument for `TypedDict`), using Pydantic V2 (up to and including 2.14.1).

Pydantic models (`BaseModel`) are not affected, as extra data is stored separately from fields.

---

_Free to read, with fair use of about 60 pages a minute. For higher limits or API access: sales@infrastack.ai_
