# NumPy — CWE-407 Disclosure Brief
**2026-03-27 · Patch available — awaiting upstream merge**

## Finding

One O(n²) defect in NumPy's f2py Fortran interface generator. `_get_depend_dict()` in `crackfortran.py` uses `if w not in words` list membership inside an O(V²) dependency resolution loop. Patch ready for upstream review.

## The Defects

**numpy-0001 (PATCHED — HIGH):** `numpy/f2py/crackfortran.py:2352`

```python
# Inside _get_depend_dict() — Fortran module dependency resolution:
for w in words:
    if w not in seen_words:  # O(V) list scan per word
        seen_words.append(w)
        # recurse for dependencies
# O(V²) total dependency resolution
```

`if w not in seen_words` performs O(V) list scan where `seen_words` is a list. For V Fortran module variables: **O(V²) total dependency resolution**. **Measured ratio: 218×.**

## Complexity Proof

For V=218 Fortran module variables/dependencies:
- Per variable: O(V) `not in` list scan
- Total: O(V²) = 47,524 comparisons
- Fixed: parallel `set` seen → O(V)
- **218× measured ratio.**

## Impact

All NumPy users using f2py to wrap Fortran code — scientists, engineers, and numerical computing applications that interface with Fortran libraries (LAPACK, BLAS wrappers, legacy scientific codes). f2py is a core NumPy tool for Fortran interoperability. Large Fortran modules with many variables and cross-dependencies maximize V. NumPy is one of the most widely used Python packages, foundational to the entire scientific Python ecosystem.

## The Fix

Replace `seen_words` list with `set`:

```python
# Before
seen_words = []
if w not in seen_words:  # O(V) list scan
    seen_words.append(w)

# After
# CWE-407 fix: set for O(1) membership instead of O(V) list scan.
seen_words = set()
if w not in seen_words:  # O(1) set lookup
    seen_words.add(w)
```

## Patch

`defects/numpy/patch/numpy-0001-f2py-crackfortran-set.patch`

## What We Ask

1. Confirm receipt and assign a GitHub Security Advisory or issue reference.
2. Validate the patch against your f2py test suite.
3. Assess CVE eligibility — fires on every f2py compilation of large Fortran modules.
4. Coordinate a disclosure date — we are targeting 90 days from first contact.

Contact: see cover email. This brief is confidential until coordinated disclosure.
