Workstation Security Audit
Run these checks with run_in_terminal or bash. Report every finding with a severity (CRITICAL / HIGH / MEDIUM / INFO / PASS) and a concrete fix. Summarize results in a table at the end.
1. macOS System Security
/usr/libexec/ApplicationFirewall/socketfilterfw --getglobalstate 2>/dev/null
/usr/libexec/ApplicationFirewall/socketfilterfw --getstealthmode 2>/dev/null
fdesetup status 2>/dev/null
csrutil status 2>/dev/null
spctl --status 2>/dev/null
| Check |
Expected |
If failing |
Severity |
| Firewall |
enabled |
System Settings → Network → Firewall |
HIGH |
| Stealth mode |
on |
sudo /usr/libexec/ApplicationFirewall/socketfilterfw --setstealthmode on |
MEDIUM |
| FileVault |
On |
System Settings → Privacy & Security → FileVault |
CRITICAL |
| SIP |
enabled |
Boot Recovery → csrutil enable |
CRITICAL |
| Gatekeeper |
assessments enabled |
System Settings → Privacy & Security → Allow apps from App Store and identified developers |
HIGH |
Additional OS Hardening
Automatic security updates — must be enabled:
softwareupdate --schedule 2>/dev/null
defaults read /Library/Preferences/com.apple.SoftwareUpdate AutomaticallyInstallMacOSUpdates 2>/dev/null
defaults read /Library/Preferences/com.apple.SoftwareUpdate CriticalUpdateInstall 2>/dev/null
defaults read /Library/Preferences/com.apple.SoftwareUpdate AutomaticDownload 2>/dev/null
CriticalUpdateInstall and AutomaticDownload should return 1. If not → MEDIUM. Fix: System Settings → General → Software Update → Automatic Updates.
Screen lock — must require password immediately:
sysadminctl -screenLock status 2>/dev/null
If not immediate → MEDIUM. Fix: System Settings → Lock Screen → Require password immediately.
Remote Login (SSH server) — should be off unless needed (requires admin):
sudo systemsetup -getremotelogin 2>/dev/null || echo "Requires admin — check System Settings → General → Sharing → Remote Login"
If "On" → MEDIUM. Fix: System Settings → General → Sharing → disable Remote Login.
Login items and LaunchAgents — review for unexpected persistence:
ls ~/Library/LaunchAgents/ 2>/dev/null
ls /Library/LaunchAgents/ 2>/dev/null
Flag unknown or suspicious entries → MEDIUM.
2. Nav Platform Security
These checks are specific to Nav developer machines connected to the NAIS platform.
Note: Only check the tools listed below. Missing optional developer tools (Copilot CLI, nav-pilot, etc.) are not security findings and should not be reported.
naisdevice — must be installed and healthy:
ls /Applications/naisdevice.app 2>/dev/null && echo "INSTALLED" || echo "NOT INSTALLED"
Not installed → HIGH. Fix: brew install --cask nais/tap/naisdevice.
Kolide agent — must be enrolled and running:
ps aux | grep -i kolide | grep -v grep | head -3
ls /private/var/kolide-k2/ 2>/dev/null
Not running → HIGH. Fix: Enroll at https://auth.kolide.com/device/registrations/new. Resolve any Kolide issues flagged in Slack.
GitHub CLI — check auth state:
gh auth status 2>/dev/null
Not logged in or expired → MEDIUM. Fix: run gh auth login outside the cplt
sandbox. Inside a sandbox the gh guard blocks gh auth login as credential
modification, and it is on by default (the standard preset, cplt#335), so the
command will fail there no matter how many times it is retried. gh auth status
itself is allowed; only the token-revealing form (--show-token/-t) is blocked.
Security scanning tools — should be installed:
which trivy gitleaks zizmor 2>/dev/null
Missing tools → INFO. Fix: brew install trivy gitleaks zizmor.
gcloud authentication — check for active credentials:
gcloud auth list 2>/dev/null | head -5
Review active accounts — ensure only your Nav identity is active.
3. SSH Configuration
- Check
~/.ssh/ directory permissions — must be 700:stat -f "%Sp %p" ~/.ssh 2>/dev/null
- Check private key permissions — must be
600:find ~/.ssh -type f -name "id_*" ! -name "*.pub" -exec stat -f "%Sp %p %N" {} \;
- Check SSH key algorithm strength — weak keys are HIGH:
for key in ~/.ssh/id_*; do
[ -f "$key" ] && [[ "$key" != *.pub ]] && ssh-keygen -l -f "$key" 2>/dev/null
done
RSA < 3072 bits → HIGH. DSA → CRITICAL (deprecated). Ed25519 or ECDSA → PASS.
- SSH private keys should be encrypted — unencrypted keys are HIGH:
for key in ~/.ssh/id_*; do
if [ -f "$key" ] && [[ "$key" != *.pub ]]; then
ssh-keygen -y -P "" -f "$key" &>/dev/null && echo "Unencrypted key: $key"
fi
done
Any reported key is not encrypted. Fix: set a passphrase on the key(s), manage them in your password manager, or use a tool like Secretive.
- Check for
ForwardAgent yes — HIGH if enabled for untrusted hosts:grep -n "ForwardAgent" ~/.ssh/config 2>/dev/null
Fix: remove ForwardAgent yes; use ssh -A <host> only when needed.
- Check for
StrictHostKeyChecking no — HIGH if set globally:grep -n "StrictHostKeyChecking" ~/.ssh/config 2>/dev/null
4. Git Configuration
- Credential helper —
osxkeychain or manager is secure; store is HIGH (plaintext); cache is MEDIUM:git config --global credential.helper
- Plaintext credentials — must not exist (CRITICAL):
ls -la ~/.git-credentials ~/.netrc 2>/dev/null
- Commit signing — recommended (INFO if missing):
git config --global commit.gpgsign
- TLS verification — must not be
false (CRITICAL):git config --global http.sslVerify
- Pre-commit hooks — check for secret scanners (gitleaks, detect-secrets):
git config --global core.hooksPath
5. Credential Files
Sensitive files must be 600 (owner-only). Check each that exists:
for f in ~/.npmrc ~/.yarnrc.yml ~/.kube/config ~/.docker/config.json \
~/.pulumi/credentials.json ~/.terraform.d/credentials.tfrc.json \
~/.config/gh/hosts.yml ~/.aws/credentials ~/.azure/accessTokens.json \
~/.netrc; do
[ -f "$f" ] && stat -f "%Sp %N" "$f"
done
Any file with group/other read → HIGH. Fix: chmod 600 <file>.
Scan for plaintext tokens (CRITICAL if found):
grep -l "authToken=ghp_\|authToken=npm_\|authToken=glpat-\|_password=" ~/.npmrc 2>/dev/null
grep -l "npmAuthToken:" ~/.yarnrc.yml 2>/dev/null
grep -l "password" ~/.pypirc ~/.netrc 2>/dev/null
Fix: remove hardcoded tokens; use environment variables or credential helpers.
Cloud provider credentials — JSON files in ~/.config/gcloud/, ~/.aws/, ~/.azure/ should be 600:
find ~/.config/gcloud ~/.aws ~/.azure -name "*.json" -o -name "credentials" 2>/dev/null | \
xargs -I{} stat -f "%Sp %N" {} 2>/dev/null
6. Shell Configuration
- History files must be
600:stat -f "%Sp %p" ~/.zsh_history ~/.bash_history 2>/dev/null
- History privacy — sensitive commands should be excludable (INFO if not set):
- zsh:
grep HIST_IGNORE_SPACE ~/.zshrc
- bash:
grep HISTCONTROL ~/.bashrc
- Secrets in shell profiles — scan for hardcoded API keys, tokens, passwords (HIGH if found):
grep -nE '^\s*export\s+\w*(API_KEY|SECRET|_TOKEN|PASSWORD|AWS_SECRET|GITHUB_TOKEN|NPM_TOKEN|PRIVATE_KEY)\s*=' \
~/.zshrc ~/.zprofile ~/.zshenv ~/.bashrc ~/.bash_profile ~/.profile 2>/dev/null
- Remote code execution patterns —
curl | bash in profiles (MEDIUM):grep -nE 'curl\s.*\|\s*(ba)?sh|wget\s.*\|\s*(ba)?sh' \
~/.zshrc ~/.zprofile ~/.bashrc ~/.bash_profile 2>/dev/null
Note: eval "$(brew shellenv)" and eval "$(mise activate)" are standard and safe.
7. Network Exposure
Services listening on all interfaces (0.0.0.0) — flag anything unexpected (MEDIUM):
lsof -i -P -n 2>/dev/null | grep LISTEN | grep -v '127.0.0.1\|::1' | awk '{print $1, $9}' | sort -u
Known safe: rapportd (Apple Handoff), Tailscale/IPNExtension (VPN), ControlCenter (AirPlay — disable if unused).
Dev servers (node, python) on 0.0.0.0 should bind to 127.0.0.1 instead.
Firewall exceptions — review for stale entries:
/usr/libexec/ApplicationFirewall/socketfilterfw --listapps 2>/dev/null | head -1
Flag if >30 exceptions (INFO). Remove stale entries in System Settings → Firewall → Options.
8. Package Managers & Developer Tools
npm — check TLS and script settings:
npm config get strict-ssl 2>/dev/null
npm config get ignore-scripts 2>/dev/null
strict-ssl=false → HIGH (TLS disabled). ignore-scripts absent → INFO.
pip — check for TLS bypass:
python3 -m pip config list 2>/dev/null | grep -E 'trusted-host|index-url'
trusted-host set → HIGH (TLS bypassed). Custom index-url not pointing to pypi.org → MEDIUM.
Go — check checksum verification:
go env GONOSUMCHECK GONOSUMDB GOFLAGS 2>/dev/null
Non-empty GONOSUMCHECK → MEDIUM (checksum verification bypassed).
Docker — check for plaintext credentials:
cat ~/.docker/config.json 2>/dev/null | python3 -c "import sys,json; d=json.load(sys.stdin); print('credHelpers:', d.get('credHelpers',{})); print('credsStore:', d.get('credsStore','')); print('auths:', list(d.get('auths',{}).keys()))" 2>/dev/null
Plaintext auth or password in auths → HIGH. Using credHelpers or credsStore → PASS.
Homebrew — list third-party taps for awareness:
brew tap 2>/dev/null | grep -v '^homebrew/'
Review for unexpected taps → INFO.
VS Code — list extensions for review:
code --list-extensions 2>/dev/null | wc -l
Review for extensions from unknown publishers → INFO.
9. Outdated Software
Outdated tools can contain known vulnerabilities. Check each package manager for pending updates.
Homebrew formulae — check for outdated packages:
brew outdated 2>/dev/null
Security-critical tools outdated (trivy, gitleaks, zizmor, git) → MEDIUM. Others → INFO. Fix: brew upgrade.
Homebrew casks — check for outdated applications:
brew outdated --cask 2>/dev/null
Outdated browsers or naisdevice → MEDIUM. Others → INFO. Fix: brew upgrade --cask.
npm global packages:
npm outdated -g 2>/dev/null
Outdated → INFO. Fix: npm update -g.
pip packages:
pip3 list --outdated 2>/dev/null
Outdated → INFO. Fix: pip3 install --upgrade <package>.
mise/asdf runtimes:
mise outdated 2>/dev/null
Outdated → INFO. Fix: mise upgrade.
macOS system updates:
softwareupdate -l 2>/dev/null
Pending security updates → MEDIUM. Other updates → INFO. Fix: softwareupdate -ia.
Report Format
Summarize all findings in a table:
| Severity | Category | Finding | Remediation |
|----------|-------------|--------------------------------------|-----------------------|
| CRITICAL | Credentials | Plaintext token in ~/.npmrc | Remove token, use env |
| HIGH | SSH | ForwardAgent enabled for 'myhost' | Remove from config |
| PASS | FileVault | Disk encryption enabled | |
End with an overall verdict: CRITICAL / HIGH / MEDIUM / GOOD based on the worst finding, and a count summary (e.g., "0 critical, 1 high, 2 medium, 18 passed").
Related
| Resource |
Use For |
@security-champion |
Trusselmodellering, compliance, Navs sikkerhetsarkitektur |
@security-review |
Sikkerhetssjekk av kodeendringer før commit/push |
$nav-auth |
JWT-validering, TokenX, ID-porten, Maskinporten |
$nais |
Nais-manifest, accessPolicy, hemmeligheter |
| sikkerhet.nav.no |
Navs Golden Path og autoritative sikkerhetsretningslinjer |
1---2name: workstation-security3description: Sikkerhetssjekk for macOS-utviklermaskiner — brannmur, SSH, Git, hemmeligheter, nettverk og Nav-plattformverktøy4license: MIT5---67# Workstation Security Audit89Run these checks with `run_in_terminal` or `bash`. Report every finding with a severity (CRITICAL / HIGH / MEDIUM / INFO / PASS) and a concrete fix. Summarize results in a table at the end.1011## 1. macOS System Security1213```bash14/usr/libexec/ApplicationFirewall/socketfilterfw --getglobalstate 2>/dev/null15/usr/libexec/ApplicationFirewall/socketfilterfw --getstealthmode 2>/dev/null16fdesetup status 2>/dev/null17csrutil status 2>/dev/null18spctl --status 2>/dev/null19```2021| Check | Expected | If failing | Severity |22|-------|----------|------------|----------|23| Firewall | enabled | System Settings → Network → Firewall | HIGH |24| Stealth mode | on | `sudo /usr/libexec/ApplicationFirewall/socketfilterfw --setstealthmode on` | MEDIUM |25| FileVault | On | System Settings → Privacy & Security → FileVault | CRITICAL |26| SIP | enabled | Boot Recovery → `csrutil enable` | CRITICAL |27| Gatekeeper | assessments enabled | System Settings → Privacy & Security → Allow apps from App Store and identified developers | HIGH |2829### Additional OS Hardening30311. Automatic security updates — must be enabled:32 ```bash33 softwareupdate --schedule 2>/dev/null34 defaults read /Library/Preferences/com.apple.SoftwareUpdate AutomaticallyInstallMacOSUpdates 2>/dev/null35 defaults read /Library/Preferences/com.apple.SoftwareUpdate CriticalUpdateInstall 2>/dev/null36 defaults read /Library/Preferences/com.apple.SoftwareUpdate AutomaticDownload 2>/dev/null37 ```38 `CriticalUpdateInstall` and `AutomaticDownload` should return `1`. If not → **MEDIUM**. Fix: System Settings → General → Software Update → Automatic Updates.39402. Screen lock — must require password immediately:41 ```bash42 sysadminctl -screenLock status 2>/dev/null43 ```44 If not immediate → **MEDIUM**. Fix: System Settings → Lock Screen → Require password immediately.45463. Remote Login (SSH server) — should be off unless needed (requires admin):47 ```bash48 sudo systemsetup -getremotelogin 2>/dev/null || echo "Requires admin — check System Settings → General → Sharing → Remote Login"49 ```50 If "On" → **MEDIUM**. Fix: System Settings → General → Sharing → disable Remote Login.51524. Login items and LaunchAgents — review for unexpected persistence:53 ```bash54 ls ~/Library/LaunchAgents/ 2>/dev/null55 ls /Library/LaunchAgents/ 2>/dev/null56 ```57 Flag unknown or suspicious entries → **MEDIUM**.5859## 2. Nav Platform Security6061These checks are specific to Nav developer machines connected to the NAIS platform.6263> **Note:** Only check the tools listed below. Missing optional developer tools (Copilot CLI, nav-pilot, etc.) are not security findings and should not be reported.64651. **naisdevice** — must be installed and healthy:66 ```bash67 ls /Applications/naisdevice.app 2>/dev/null && echo "INSTALLED" || echo "NOT INSTALLED"68 ```69 Not installed → **HIGH**. Fix: `brew install --cask nais/tap/naisdevice`.70712. **Kolide agent** — must be enrolled and running:72 ```bash73 ps aux | grep -i kolide | grep -v grep | head -374 ls /private/var/kolide-k2/ 2>/dev/null75 ```76 Not running → **HIGH**. Fix: Enroll at https://auth.kolide.com/device/registrations/new. Resolve any Kolide issues flagged in Slack.77783. **GitHub CLI** — check auth state:79 ```bash80 gh auth status 2>/dev/null81 ```82 Not logged in or expired → **MEDIUM**. Fix: run `gh auth login` **outside** the cplt83 sandbox. Inside a sandbox the gh guard blocks `gh auth login` as credential84 modification, and it is on by default (the `standard` preset, cplt#335), so the85 command will fail there no matter how many times it is retried. `gh auth status`86 itself is allowed; only the token-revealing form (`--show-token`/`-t`) is blocked.87884. **Security scanning tools** — should be installed:89 ```bash90 which trivy gitleaks zizmor 2>/dev/null91 ```92 Missing tools → **INFO**. Fix: `brew install trivy gitleaks zizmor`.93945. **gcloud authentication** — check for active credentials:95 ```bash96 gcloud auth list 2>/dev/null | head -597 ```98 Review active accounts — ensure only your Nav identity is active.99100## 3. SSH Configuration1011021. Check `~/.ssh/` directory permissions — must be `700`:103 ```bash104 stat -f "%Sp %p" ~/.ssh 2>/dev/null105 ```1062. Check private key permissions — must be `600`:107 ```bash108 find ~/.ssh -type f -name "id_*" ! -name "*.pub" -exec stat -f "%Sp %p %N" {} \;109 ```1103. Check SSH key algorithm strength — weak keys are **HIGH**:111 ```bash112 for key in ~/.ssh/id_*; do113 [ -f "$key" ] && [[ "$key" != *.pub ]] && ssh-keygen -l -f "$key" 2>/dev/null114 done115 ```116 RSA < 3072 bits → **HIGH**. DSA → **CRITICAL** (deprecated). Ed25519 or ECDSA → **PASS**.1174. SSH private keys should be encrypted — unencrypted keys are **HIGH**:118 ```bash119 for key in ~/.ssh/id_*; do120 if [ -f "$key" ] && [[ "$key" != *.pub ]]; then121 ssh-keygen -y -P "" -f "$key" &>/dev/null && echo "Unencrypted key: $key"122 fi123 done124 ```125 Any reported key is not encrypted. Fix: set a passphrase on the key(s), manage them in your password manager, or use a tool like [Secretive](https://github.com/maxgoedjen/secretive).1265. Check for `ForwardAgent yes` — **HIGH** if enabled for untrusted hosts:127 ```bash128 grep -n "ForwardAgent" ~/.ssh/config 2>/dev/null129 ```130 Fix: remove `ForwardAgent yes`; use `ssh -A <host>` only when needed.1316. Check for `StrictHostKeyChecking no` — **HIGH** if set globally:132 ```bash133 grep -n "StrictHostKeyChecking" ~/.ssh/config 2>/dev/null134 ```135136## 4. Git Configuration1371381. Credential helper — `osxkeychain` or `manager` is secure; `store` is **HIGH** (plaintext); `cache` is **MEDIUM**:139 ```bash140 git config --global credential.helper141 ```1422. Plaintext credentials — must not exist (**CRITICAL**):143 ```bash144 ls -la ~/.git-credentials ~/.netrc 2>/dev/null145 ```1463. Commit signing — recommended (**INFO** if missing):147 ```bash148 git config --global commit.gpgsign149 ```1504. TLS verification — must not be `false` (**CRITICAL**):151 ```bash152 git config --global http.sslVerify153 ```1545. Pre-commit hooks — check for secret scanners (gitleaks, detect-secrets):155 ```bash156 git config --global core.hooksPath157 ```158159## 5. Credential Files1601611. Sensitive files must be `600` (owner-only). Check each that exists:162 ```bash163 for f in ~/.npmrc ~/.yarnrc.yml ~/.kube/config ~/.docker/config.json \164 ~/.pulumi/credentials.json ~/.terraform.d/credentials.tfrc.json \165 ~/.config/gh/hosts.yml ~/.aws/credentials ~/.azure/accessTokens.json \166 ~/.netrc; do167 [ -f "$f" ] && stat -f "%Sp %N" "$f"168 done169 ```170 Any file with group/other read → **HIGH**. Fix: `chmod 600 <file>`.1711722. Scan for plaintext tokens (**CRITICAL** if found):173 ```bash174 grep -l "authToken=ghp_\|authToken=npm_\|authToken=glpat-\|_password=" ~/.npmrc 2>/dev/null175 grep -l "npmAuthToken:" ~/.yarnrc.yml 2>/dev/null176 grep -l "password" ~/.pypirc ~/.netrc 2>/dev/null177 ```178 Fix: remove hardcoded tokens; use environment variables or credential helpers.1791803. Cloud provider credentials — JSON files in `~/.config/gcloud/`, `~/.aws/`, `~/.azure/` should be `600`:181 ```bash182 find ~/.config/gcloud ~/.aws ~/.azure -name "*.json" -o -name "credentials" 2>/dev/null | \183 xargs -I{} stat -f "%Sp %N" {} 2>/dev/null184 ```185186## 6. Shell Configuration1871881. History files must be `600`:189 ```bash190 stat -f "%Sp %p" ~/.zsh_history ~/.bash_history 2>/dev/null191 ```1922. History privacy — sensitive commands should be excludable (**INFO** if not set):193 - zsh: `grep HIST_IGNORE_SPACE ~/.zshrc`194 - bash: `grep HISTCONTROL ~/.bashrc`1953. Secrets in shell profiles — scan for hardcoded API keys, tokens, passwords (**HIGH** if found):196 ```bash197 grep -nE '^\s*export\s+\w*(API_KEY|SECRET|_TOKEN|PASSWORD|AWS_SECRET|GITHUB_TOKEN|NPM_TOKEN|PRIVATE_KEY)\s*=' \198 ~/.zshrc ~/.zprofile ~/.zshenv ~/.bashrc ~/.bash_profile ~/.profile 2>/dev/null199 ```2004. Remote code execution patterns — `curl | bash` in profiles (**MEDIUM**):201 ```bash202 grep -nE 'curl\s.*\|\s*(ba)?sh|wget\s.*\|\s*(ba)?sh' \203 ~/.zshrc ~/.zprofile ~/.bashrc ~/.bash_profile 2>/dev/null204 ```205 Note: `eval "$(brew shellenv)"` and `eval "$(mise activate)"` are standard and safe.206207## 7. Network Exposure2082091. Services listening on all interfaces (0.0.0.0) — flag anything unexpected (**MEDIUM**):210 ```bash211 lsof -i -P -n 2>/dev/null | grep LISTEN | grep -v '127.0.0.1\|::1' | awk '{print $1, $9}' | sort -u212 ```213 Known safe: rapportd (Apple Handoff), Tailscale/IPNExtension (VPN), ControlCenter (AirPlay — disable if unused).214 Dev servers (node, python) on 0.0.0.0 should bind to 127.0.0.1 instead.2152162. Firewall exceptions — review for stale entries:217 ```bash218 /usr/libexec/ApplicationFirewall/socketfilterfw --listapps 2>/dev/null | head -1219 ```220 Flag if >30 exceptions (**INFO**). Remove stale entries in System Settings → Firewall → Options.221222## 8. Package Managers & Developer Tools2232241. **npm** — check TLS and script settings:225 ```bash226 npm config get strict-ssl 2>/dev/null227 npm config get ignore-scripts 2>/dev/null228 ```229 `strict-ssl=false` → **HIGH** (TLS disabled). `ignore-scripts` absent → **INFO**.2302312. **pip** — check for TLS bypass:232 ```bash233 python3 -m pip config list 2>/dev/null | grep -E 'trusted-host|index-url'234 ```235 `trusted-host` set → **HIGH** (TLS bypassed). Custom `index-url` not pointing to pypi.org → **MEDIUM**.2362373. **Go** — check checksum verification:238 ```bash239 go env GONOSUMCHECK GONOSUMDB GOFLAGS 2>/dev/null240 ```241 Non-empty GONOSUMCHECK → **MEDIUM** (checksum verification bypassed).2422434. **Docker** — check for plaintext credentials:244 ```bash245 cat ~/.docker/config.json 2>/dev/null | python3 -c "import sys,json; d=json.load(sys.stdin); print('credHelpers:', d.get('credHelpers',{})); print('credsStore:', d.get('credsStore','')); print('auths:', list(d.get('auths',{}).keys()))" 2>/dev/null246 ```247 Plaintext `auth` or `password` in `auths` → **HIGH**. Using `credHelpers` or `credsStore` → **PASS**.2482495. **Homebrew** — list third-party taps for awareness:250 ```bash251 brew tap 2>/dev/null | grep -v '^homebrew/'252 ```253 Review for unexpected taps → **INFO**.2542556. **VS Code** — list extensions for review:256 ```bash257 code --list-extensions 2>/dev/null | wc -l258 ```259 Review for extensions from unknown publishers → **INFO**.260261## 9. Outdated Software262263Outdated tools can contain known vulnerabilities. Check each package manager for pending updates.2642651. **Homebrew formulae** — check for outdated packages:266 ```bash267 brew outdated 2>/dev/null268 ```269 Security-critical tools outdated (trivy, gitleaks, zizmor, git) → **MEDIUM**. Others → **INFO**. Fix: `brew upgrade`.2702712. **Homebrew casks** — check for outdated applications:272 ```bash273 brew outdated --cask 2>/dev/null274 ```275 Outdated browsers or naisdevice → **MEDIUM**. Others → **INFO**. Fix: `brew upgrade --cask`.2762773. **npm global packages**:278 ```bash279 npm outdated -g 2>/dev/null280 ```281 Outdated → **INFO**. Fix: `npm update -g`.2822834. **pip packages**:284 ```bash285 pip3 list --outdated 2>/dev/null286 ```287 Outdated → **INFO**. Fix: `pip3 install --upgrade <package>`.2882895. **mise/asdf runtimes**:290 ```bash291 mise outdated 2>/dev/null292 ```293 Outdated → **INFO**. Fix: `mise upgrade`.2942956. **macOS system updates**:296 ```bash297 softwareupdate -l 2>/dev/null298 ```299 Pending security updates → **MEDIUM**. Other updates → **INFO**. Fix: `softwareupdate -ia`.300301## Report Format302303Summarize all findings in a table:304305```306| Severity | Category | Finding | Remediation |307|----------|-------------|--------------------------------------|-----------------------|308| CRITICAL | Credentials | Plaintext token in ~/.npmrc | Remove token, use env |309| HIGH | SSH | ForwardAgent enabled for 'myhost' | Remove from config |310| PASS | FileVault | Disk encryption enabled | |311```312313End with an overall verdict: **CRITICAL** / **HIGH** / **MEDIUM** / **GOOD** based on the worst finding, and a count summary (e.g., "0 critical, 1 high, 2 medium, 18 passed").314315## Related316317| Resource | Use For |318|----------|---------|319| `@security-champion` | Trusselmodellering, compliance, Navs sikkerhetsarkitektur |320| `@security-review` | Sikkerhetssjekk av kodeendringer før commit/push |321| `$nav-auth` | JWT-validering, TokenX, ID-porten, Maskinporten |322| `$nais` | Nais-manifest, accessPolicy, hemmeligheter |323| [sikkerhet.nav.no](https://sikkerhet.nav.no) | Navs Golden Path og autoritative sikkerhetsretningslinjer |