GitHub Action
Run OWASP Noir in GitHub Actions for endpoint discovery and optional passive security scanning during CI.
Quick Start
Minimal workflow:
name: Noir Security Analysis
on: [push, pull_request]
jobs:
noir-analysis:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- name: Run OWASP Noir
id: noir
uses: owasp-noir/noir@main
with:
base_path: '.'
- name: Display results
run: echo '${{ steps.noir.outputs.endpoints }}' | jq .
base_path: Directory to analyze (-b/--base-path)endpoints: JSON output for post-processing
Inputs
| Name | Description | Required | Default |
|---|---|---|---|
base_path |
Base path to analyze (equivalent to -b/--base-path) |
Yes | . |
url |
Base URL for endpoints (equivalent to -u/--url) |
No | `` |
format |
Output format (plain, yaml, json, jsonl, markdown-table, curl, httpie, oas2, oas3, etc.) |
No | json |
output_file |
Write results to a file (equivalent to -o/--output) |
No | `` |
techs |
Technologies to include (equivalent to -t/--techs) |
No | `` |
exclude_techs |
Technologies to exclude (--exclude-techs) |
No | `` |
passive_scan |
Enable passive security scan (-P/--passive-scan) |
No | false |
passive_scan_severity |
Minimum severity for passive scan (critical, high, medium, low) |
No | high |
use_all_taggers |
Enable all taggers for comprehensive analysis (-T/--use-all-taggers) |
No | false |
use_taggers |
Enable specific taggers (--use-taggers) |
No | `` |
include_path |
Include source file paths in results (--include-path) |
No | false |
verbose |
Verbose output (--verbose) |
No | false |
debug |
Debug output (-d/--debug) |
No | false |
concurrency |
Concurrency level (--concurrency) |
No | `` |
exclude_codes |
Exclude HTTP response codes (comma‑separated) (--exclude-codes) |
No | `` |
status_codes |
Display HTTP status codes for discovered endpoints (--status-codes) |
No | false |
Notes:
- Pass boolean options as strings (
'true'/'false') output_filewrites to file and provides outputs
Outputs
| Name | Description |
|---|---|
endpoints |
JSON‑formatted endpoint analysis |
passive_results |
JSON‑formatted passive scan findings (present when passive_scan is enabled) |
Consuming outputs:
- name: Count endpoints
run: echo '${{ steps.noir.outputs.endpoints }}' | jq '.endpoints | length'
- name: Show passive issues (if enabled)
run: echo '${{ steps.noir.outputs.passive_results }}' | jq '. | length'
Examples
Advanced Scan
name: Comprehensive Security Analysis
on: [push, pull_request]
jobs:
security-scan:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- name: Run OWASP Noir with Passive Scanning
id: noir
uses: owasp-noir/noir@main
with:
base_path: 'src'
format: 'json'
passive_scan: 'true'
passive_scan_severity: 'medium'
use_all_taggers: 'true'
include_path: 'true'
verbose: 'true'
output_file: 'noir-results.json'
- name: Process Results
run: |
echo "🔍 Endpoints discovered:"
echo '${{ steps.noir.outputs.endpoints }}' | jq '.endpoints | length'
echo "🚨 Security issues found:"
echo '${{ steps.noir.outputs.passive_results }}' | jq '. | length'
- name: Save detailed results
uses: actions/upload-artifact@v4
with:
name: noir-security-results
path: noir-results.json
Monorepo Matrix
name: Monorepo Noir
on: [push, pull_request]
jobs:
noir:
runs-on: ubuntu-latest
strategy:
matrix:
service: [service-a, service-b, service-c]
steps:
- uses: actions/checkout@v6
- name: Run Noir for ${{ matrix.service }}
id: noir
uses: owasp-noir/noir@main
with:
base_path: '${{ matrix.service }}'
format: 'json'
include_path: 'true'
Framework-Specific Scans
- uses: owasp-noir/noir@main
with:
base_path: '.'
techs: 'rails' # ruby on rails
passive_scan: 'true'
- uses: owasp-noir/noir@main
with:
base_path: 'src'
techs: 'express' # node.js express
format: 'json'
- uses: owasp-noir/noir@main
with:
base_path: '.'
techs: 'django' # python django
passive_scan: 'true'
passive_scan_severity: 'medium'
Status Code Configuration
- uses: owasp-noir/noir@main
with:
base_path: '.'
status_codes: 'true' # include HTTP status codes
exclude_codes: '404,429' # suppress noisy codes
Alternate Formats
- uses: owasp-noir/noir@main
with:
base_path: '.'
format: 'markdown-table' # or: 'curl', 'httpie', 'yaml', 'jsonl', 'oas3'
output_file: 'noir.md'
Best Practices
- Enable passive scanning (
passive_scan: 'true') to surface security smells early. - Tune noise with
passive_scan_severityandexclude_codes. - Include paths (
include_path: 'true') to speed up triage and code navigation. - Pin frameworks with
techswhen auto‑detection isn’t enough; useexclude_techsto avoid irrelevant analyzers. - Persist results with
actions/upload-artifact
Troubleshooting
No endpoints found:
- Verify
base_pathpoints to source directory - Check repository contains supported frameworks
- Specify
techsexplicitly
Output too large or slow:
- Use
format: 'jsonl'for streaming - Narrow
base_pathor usetechs/exclude_techs
Hard to diagnose:
- Enable
debug: 'true'andverbose: 'true' - Use
include_path: 'true'for traceability
HTTP status noise:
- Disable with
status_codes: 'false'or useexclude_codes
Implementation Notes
- Runs in Docker container for consistency
- Inputs map directly to CLI flags
- See supported technologies:
noir --list-techs