Security
CI runs your code with your secrets, so "trust us" isn't enough. Here is every step a job takes, from the moment you push to the moment its machine is gone, and what protects it at each one.
Step 01
When a job asks for runs-on: overline, GitHub sends our GitHub App an event. That event is the only way a job reaches us, so we check that it really came from GitHub.
Step 02
For each job we ask GitHub for a runner registration that can only ever run one job, and hand it to a single machine.
Step 03
The job runs inside its own virtual machine, isolated from other jobs at the hardware level, not in a container sharing a kernel.
Step 04
Every machine gets a private network of its own. Your job can reach the internet like it would on GitHub, and nothing else.
Step 05
Secrets are part of the job GitHub sends to the runner inside the machine. They take the direct route, and we keep them out of what we store.
Step 06
When the job finishes, everything it touched is deleted. The next job, yours or anyone's, starts from the clean image.
Permissions
This is the complete list. The app can't read your code, your secrets, pull requests or issues.
| Permission | Access | Why |
|---|---|---|
| Self-hosted runners | read & write | Register a single-use runner for each job, at the organization level. |
| Actions | read | Receive job events and show job and step status in the dashboard. |
| Metadata | read | Required by GitHub for every app. |