TL;DR
Australian SMBs do not need an enterprise-sized AppSec team to harden their CI/CD pipelines. The practical win is to layer SAST, SCA and secret scanning in the right stages, set sensible fail-the-build rules, and use advisory-only mode where signal is still maturing.
Recent supply-chain incidents in March 2026 were another reminder that pipelines are now a primary attack path. If your build runners can access secrets, cloud accounts or deployment tokens, your pipeline is part of your production attack surface.
Get Our Weekly Cybersecurity Digest
Every Thursday: the threats that matter, what they mean for your business, and exactly what to do. Trusted by SMB owners across Australia.
No spam. No tracking. Unsubscribe anytime. Privacy
Why pipeline hardening matters now
A lot of SMB teams still treat CI as a convenience layer. That is outdated. Modern pipelines compile code, pull dependencies, run third-party actions, scan containers, sign artefacts and deploy to production. If an attacker compromises that path, they often inherit your trust relationships as well.
Free Resource
Get the Free Cybersecurity Checklist
A practical, no-jargon security checklist for Australian businesses. Download free — no spam, unsubscribe anytime.
Send Me the Checklist →The practical lesson from the recent GitHub Actions, PyPI and npm incidents is simple: don’t trust a single scanner, and don’t let any one control carry the whole burden. SAST finds insecure code patterns. SCA finds vulnerable or risky dependencies. Secret scanning catches exposed credentials before they become an incident. Each covers a different failure mode.
For Australian technical leads, the goal is not “maximum scanning everywhere”. It is controlled, layered enforcement that catches high-risk issues early without training developers to ignore alerts.
Build the pipeline in layers, not as one giant gate
Start with three layers.
- SAST for your own code. Semgrep is fast and easy to tune, which makes it ideal for pull requests. CodeQL is slower but deeper, so it works well for scheduled analysis and protected branches.
- SCA for dependencies and images. OSV-Scanner is lightweight and good for open ecosystems. Trivy covers filesystems, lockfiles and containers. Snyk is useful where you want richer prioritisation and fix guidance.
- Secret scanning for obvious and accidental leaks. Gitleaks is a solid pre-merge gate. TruffleHog is useful for deeper entropy and history checks. GitHub secret scanning adds platform-native detection if you use GitHub Advanced Security.
A clean GitHub Actions pattern looks like this:
name: security
on:
pull_request:
push:
branches: [main]
jobs:
sast:
runs-on: ubuntu-latest
permissions: { contents: read }
steps:
- uses: actions/checkout@v4
- uses: returntocorp/semgrep-action@v1
with:
config: p/owasp-top-ten
sca:
runs-on: ubuntu-latest
permissions: { contents: read }
steps:
- uses: actions/checkout@v4
- uses: aquasecurity/[email protected]
with:
scan-type: fs
ignore-unfixed: true
severity: HIGH,CRITICAL
secrets:
runs-on: ubuntu-latest
permissions: { contents: read }
steps:
- uses: actions/checkout@v4
with: { fetch-depth: 0 }
- uses: gitleaks/gitleaks-action@v2
For GitLab CI, keep the same logic:
stages: [test, security]
semgrep:
stage: security
image: returntocorp/semgrep
script:
- semgrep ci
osv_scan:
stage: security
image: ghcr.io/google/osv-scanner:latest
script:
- osv-scanner scan --lockfile=requirements.txt
gitleaks:
stage: security
image: zricethezav/gitleaks:latest
script:
- gitleaks detect --source . --no-git
One important hardening step: pin actions and images to immutable versions or commit SHAs wherever possible. That is one of the fastest ways to reduce supply-chain risk.
Fail the build only for what is truly urgent
Most alert fatigue is self-inflicted. Teams wire every finding to a hard fail, then spend the next month creating bypasses.
A better pattern is:
- Fail the build:
- verified secrets
- critical vulnerabilities in internet-facing services
- high-confidence SAST findings in changed code
- malicious or unapproved package sources
- Advisory only:
- medium or low CVEs
- vulnerabilities with no reachable exploit path
- legacy code findings outside the current diff
- container image issues with no fix available yet
In practice, that means Semgrep on pull requests should focus on changed files and high-confidence rules. CodeQL can run nightly or on main and create triaged tickets instead of blocking every branch. Trivy and OSV-Scanner should fail only on HIGH or CRITICAL issues affecting production paths. Gitleaks should almost always be fail-fast because a real secret in Git is not a cosmetic defect.
This is where many SMBs get it wrong: they try to use one severity threshold for every repo. Use different policies for customer-facing apps, internal scripts and experimental projects.
ISO 27001 SMB Starter Pack — $97
Everything you need to start your ISO 27001 journey: gap assessment templates, policy frameworks, and implementation roadmap built for Australian SMBs.
Get the Starter Pack →Reduce noise with ownership, baselines and policy
Tooling is only half the design. The other half is governance.
First, baseline existing debt. If you enable every scanner on a mature repo and block on all historical findings, delivery stops. Capture the current state, then fail only on new issues introduced after the baseline date.
Second, map scanners to owners. Platform teams own pipeline controls. Application teams own code findings. Dependency issues should route to the service owner, not to a generic shared inbox.
Third, keep permissions minimal. Your security jobs should not have deployment rights. Your scanners should not inherit more secrets than they need. If a scanning job is compromised, its blast radius should be small.
SLSA Level 1 quick wins for SMB teams
You do not need a massive rebuild to get value from SLSA Level 1 practices.
Quick wins:
- use a hosted CI system with version-controlled build definitions
- keep build steps in Git, not in undocumented click-ops
- generate basic provenance or artefact metadata where your platform supports it
- pin third-party actions, containers and package registries
- separate build, scan and deploy permissions
- protect main branches and require pull request review
These changes improve traceability straight away. They also make later moves toward signed artefacts and stronger provenance much easier.
FAQ
Not always, but the combination is useful. Semgrep is excellent for fast PR feedback, while CodeQL gives deeper analysis for supported languages. If you need to start lean, begin with Semgrep and add CodeQL for higher-risk repos.
No. Fail on exploitable HIGH and CRITICAL issues in production paths. Keep the rest advisory-only, create remediation tickets, and review exceptions regularly.
No. It is valuable, but it should complement repository-level scanning such as Gitleaks and good secret hygiene like short-lived credentials and rotation.
Add secret scanning and dependency scanning to pull requests, then hard-fail only on verified secrets and critical production risk. That gives strong early coverage without overwhelming developers.
Conclusion
Pipeline hardening works best when it is layered, opinionated and realistic. Use Semgrep and CodeQL for code risk, OSV-Scanner, Trivy or Snyk for dependency risk, and Gitleaks, TruffleHog plus platform-native secret scanning for credential exposure. Then tune enforcement so only the findings that matter most actually block delivery.
If your team wants a practical rollout plan, start with pinned actions, minimal runner permissions, baseline existing findings and hard-fail only on secrets and critical exploitable issues. Visit consult.lil.business for a free cybersecurity assessment.
References
- ACSC Essential Eight
- NIST Secure Software Development Framework (SSDF) SP 800-218
- SLSA Framework
- GitHub Docs: About code scanning with CodeQL
- GitHub Docs: About secret scanning
Work With Us
Ready to strengthen your security posture?
lilMONSTER assesses your risks, builds the tools, and stays with you after the engagement ends. No clipboard-and-leave consulting.
Book a Free Consultation →