Security fixes for the old versions people still run
A GitLab Duo agent ports security fixes to old release lines of ws where git cherry-pick fails. CI decides what is affected and checks every patch; a human approves every step. This page is rebuilt by the pipeline from live data.
The real fix for CVE-2024-37890 on an import of ws (MIT). Project ยท Tracking issues #2, #5
The agent's backports, graded against the real maintainer
The maintainer's own backports from 2024 are the answer key. The interesting call is the client-side hunk in lib/websocket.js: needed on 7.x, not reachable on 6.x and 5.x.
| Line | Client hunk: agent | Client hunk: maintainer | Same file decisions | Maintainer's tests pass | Tests broken | Crash gone | Same code text | Shipped package, checked now |
|---|---|---|---|---|---|---|---|---|
| v7.x | kept | kept | 4 of 4 | 2 of 2 | 0 | yes | 38% | @aryan-group7171043/ws@7.5.10 yes |
| v6.x | dropped | dropped | 4 of 4 | 1 of 1 | 0 | yes | 0% | @aryan-group7171043/ws@6.2.3 yes |
| v5.x | dropped | dropped | 4 of 4 | 1 of 1 | 0 | yes | 17% | @aryan-group7171043/ws@5.2.4 yes |
Same code text is reported for transparency, not as a score: the agent wrote the same logic in different words. Behaviour, the maintainer's tests and the file decisions decide whether a patch is right.
Next: lines nobody else will fix, and a second CVE
Upstream stopped maintaining v4.x and v3.x in 2018 and 2017, so no maintainer backport of CVE-2024-37890 exists for them. Both crash on the exploit and conflict on cherry-pick (tracking issue #5). A second, larger fix, CVE-2026-48779, is defined and detected on every line but not yet backported.
Lines nobody else will fix
Upstream stopped maintaining these lines years before the CVE, so the maintainer never backported it and there is no answer key. The agent's patch is checked without one: the crash must be gone, no test of the line may newly fail, and the agent's new tests must fail on the unpatched line.
| Line | Upstream support ended | Crash gone | Tests broken | New tests that fail without the fix | Shipped package, checked now |
|---|---|---|---|---|---|
| v4.x | 2018-02-22 | yes | 0 | 1 of 1 | @aryan-group7171043/ws@4.1.1 yes |
| v3.x | 2017-12-17 | yes | 0 | 1 of 1 | @aryan-group7171043/ws@3.3.4 yes |
Approval ledger
Every action in the backport workflow: 15 changed a release line or shipped a package, 5 are agent proposals or human decisions that changed nothing, and 1 merge outside the workflow is listed and excluded. For each, the approval before it and the proposals a human sent back. Each approval is checked against the project members list: starting the agent needs Developer or above, a merge or publish needs Maintainer. Sent back: 0.
| When (UTC) | Who | Role | What | Approved by |
|---|---|---|---|---|
| 2026-10-24 09:52 | Aryanbhargava18 | Owner | merged MR !3 into v6.x | excluded in supported-lines.yml: rehearsal before the replay; v6.x was reset to 6.2.2 afterwards, so its change is not in the line |
| 2026-10-24 10:59 | ai-backport-propose-aryan-group | Developer | proposed a patch for v6.x (no repository change) | propose v6.x by @Aryanbhargava18 (Owner) |
| 2026-10-24 11:02 | ai-backport-approve-aryan-group | Developer | committed and opened MR into v6.x | approve v6.x by @Aryanbhargava18 (Owner) |
| 2026-10-24 11:08 | ai-backport-propose-aryan-group | Developer | proposed a patch for v7.x (no repository change) | propose v7.x by @Aryanbhargava18 (Owner) |
| 2026-10-24 11:12 | ai-backport-propose-aryan-group | Developer | proposed a patch for v5.x (no repository change) | propose v5.x by @Aryanbhargava18 (Owner) |
| 2026-10-24 11:16 | ai-backport-approve-aryan-group | Developer | committed and opened MR into v5.x | approve v5.x by @Aryanbhargava18 (Owner) |
| 2026-10-24 11:18 | ai-backport-approve-aryan-group | Developer | committed and opened MR into v7.x | approve v7.x by @Aryanbhargava18 (Owner) |
| 2026-10-24 11:24 | Aryanbhargava18 | Owner | merged MR !10 into v7.x | @Aryanbhargava18 (Owner) merged after approving the proposal |
| 2026-10-24 11:24 | Aryanbhargava18 | Owner | merged MR !8 into v6.x | @Aryanbhargava18 (Owner) merged after approving the proposal |
| 2026-10-24 11:25 | Aryanbhargava18 | Owner | merged MR !9 into v5.x | @Aryanbhargava18 (Owner) merged after approving the proposal |
| 2026-10-24 11:26 | Aryanbhargava18 | Owner | published v7.x (manual job 17437308053) | @Aryanbhargava18 (Owner) clicked the manual job |
| 2026-10-24 11:26 | Aryanbhargava18 | Owner | published v6.x (manual job 17437308523) | @Aryanbhargava18 (Owner) clicked the manual job |
| 2026-10-24 11:26 | Aryanbhargava18 | Owner | published v5.x (manual job 17437308982) | @Aryanbhargava18 (Owner) clicked the manual job |
| 2026-10-27 07:20 | ai-backport-propose-aryan-group | Developer | proposed a patch for v4.x (no repository change) | propose v4.x by @Aryanbhargava18 (Owner) |
| 2026-10-27 07:25 | ai-backport-approve-aryan-group | Developer | committed and opened MR into v4.x | approve v4.x by @Aryanbhargava18 (Owner) |
| 2026-10-27 07:31 | Aryanbhargava18 | Owner | merged MR !11 into v4.x | @Aryanbhargava18 (Owner) merged after approving the proposal |
| 2026-10-27 07:32 | Aryanbhargava18 | Owner | published v4.x (manual job 17494276132) | @Aryanbhargava18 (Owner) clicked the manual job |
| 2026-10-27 07:48 | ai-backport-propose-aryan-group | Developer | proposed a patch for v3.x (no repository change) | propose v3.x by @Aryanbhargava18 (Owner) |
| 2026-10-27 12:16 | ai-backport-approve-aryan-group | Developer | committed and opened MR into v3.x | approve v3.x by @Aryanbhargava18 (Owner) |
| 2026-10-27 12:18 | Aryanbhargava18 | Owner | merged MR !12 into v3.x | @Aryanbhargava18 (Owner) merged after approving the proposal |
| 2026-10-27 12:20 | Aryanbhargava18 | Owner | published v3.x (manual job 17502881436) | @Aryanbhargava18 (Owner) clicked the manual job |
Which versions the fix reaches
Each release is loaded into a server and sent the attack request. A crash means affected; no model involved.
| Line or release | Version (pre-fix) | Result | What the server did |
|---|---|---|---|
| v7.x | 7.5.9 | crashes | TypeError: Cannot read properties of undefined (reading 'toLowerCase') |
| v6.x | 6.2.2 | crashes | TypeError: Cannot read properties of undefined (reading 'toLowerCase') |
| v5.x | 5.2.3 | crashes | TypeError: Cannot read properties of undefined (reading 'toLowerCase') |
| v4.x | 4.1.0 | crashes | TypeError: Cannot read properties of undefined (reading 'toLowerCase') |
| v3.x | 3.3.3 | crashes | TypeError: Cannot read properties of undefined (reading 'toLowerCase') |
| ws@2.1.0 | 2.1.0 | crashes | TypeError: Cannot read properties of undefined (reading 'toLowerCase') |
Evidence
GitLab keeps agent sessions and the vulnerability report private to members, so they are exported here.
- Every agent tool call, with reads of the maintainer's backports flagged
- Approved-patch gate: an agent MR can't merge if its diff differs from the proposal a human approved
- Vulnerability records, one per line, resolved when the line shipped
- SAST triage: every finding with its recorded reason
- Releases and packages
Why an agent is needed
Of 22 real backports in ws history since 2018, plain cherry-pick reproduced the maintainer on 5, applied but differed on 2, and conflicted on 15. Git's automatic resolution (-X theirs) of this CVE still crashes on all three lines.