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: MIT5compatibility: macOS developer workstation6metadata:7 domain: auth8 tags: security macos developer-tools audit hardening9---1011# Workstation Security Audit1213Run 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.1415## 1. macOS System Security1617```bash18/usr/libexec/ApplicationFirewall/socketfilterfw --getglobalstate 2>/dev/null19/usr/libexec/ApplicationFirewall/socketfilterfw --getstealthmode 2>/dev/null20fdesetup status 2>/dev/null21csrutil status 2>/dev/null22spctl --status 2>/dev/null23```2425| Check | Expected | If failing | Severity |26|-------|----------|------------|----------|27| Firewall | enabled | System Settings → Network → Firewall | HIGH |28| Stealth mode | on | `sudo /usr/libexec/ApplicationFirewall/socketfilterfw --setstealthmode on` | MEDIUM |29| FileVault | On | System Settings → Privacy & Security → FileVault | CRITICAL |30| SIP | enabled | Boot Recovery → `csrutil enable` | CRITICAL |31| Gatekeeper | assessments enabled | System Settings → Privacy & Security → Allow apps from App Store and identified developers | HIGH |3233### Additional OS Hardening34351. Automatic security updates — must be enabled:36 ```bash37 softwareupdate --schedule 2>/dev/null38 defaults read /Library/Preferences/com.apple.SoftwareUpdate AutomaticallyInstallMacOSUpdates 2>/dev/null39 defaults read /Library/Preferences/com.apple.SoftwareUpdate CriticalUpdateInstall 2>/dev/null40 defaults read /Library/Preferences/com.apple.SoftwareUpdate AutomaticDownload 2>/dev/null41 ```42 `CriticalUpdateInstall` and `AutomaticDownload` should return `1`. If not → **MEDIUM**. Fix: System Settings → General → Software Update → Automatic Updates.43442. Screen lock — must require password immediately:45 ```bash46 sysadminctl -screenLock status 2>/dev/null47 ```48 If not immediate → **MEDIUM**. Fix: System Settings → Lock Screen → Require password immediately.49503. Remote Login (SSH server) — should be off unless needed (requires admin):51 ```bash52 sudo systemsetup -getremotelogin 2>/dev/null || echo "Requires admin — check System Settings → General → Sharing → Remote Login"53 ```54 If "On" → **MEDIUM**. Fix: System Settings → General → Sharing → disable Remote Login.55564. Login items and LaunchAgents — review for unexpected persistence:57 ```bash58 ls ~/Library/LaunchAgents/ 2>/dev/null59 ls /Library/LaunchAgents/ 2>/dev/null60 ```61 Flag unknown or suspicious entries → **MEDIUM**.6263## 2. Nav Platform Security6465These checks are specific to Nav developer machines connected to the NAIS platform.6667> **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.68691. **naisdevice** — must be installed and healthy:70 ```bash71 ls /Applications/naisdevice.app 2>/dev/null && echo "INSTALLED" || echo "NOT INSTALLED"72 ```73 Not installed → **HIGH**. Fix: `brew install --cask nais/tap/naisdevice`.74752. **Kolide agent** — must be enrolled and running:76 ```bash77 ps aux | grep -i kolide | grep -v grep | head -378 ls /private/var/kolide-k2/ 2>/dev/null79 ```80 Not running → **HIGH**. Fix: Enroll at https://auth.kolide.com/device/registrations/new. Resolve any Kolide issues flagged in Slack.81823. **GitHub CLI** — check auth state:83 ```bash84 gh auth status 2>/dev/null85 ```86 Not logged in or expired → **MEDIUM**. Fix: run `gh auth login` **outside** the cplt87 sandbox. Inside a sandbox the gh guard blocks `gh auth login` as credential88 modification, and it is on by default (the `standard` preset, cplt#335), so the89 command will fail there no matter how many times it is retried. `gh auth status`90 itself is allowed; only the token-revealing form (`--show-token`/`-t`) is blocked.91924. **Security scanning tools** — should be installed:93 ```bash94 which trivy gitleaks zizmor 2>/dev/null95 ```96 Missing tools → **INFO**. Fix: `brew install trivy gitleaks zizmor`.97985. **gcloud authentication** — check for active credentials:99 ```bash100 gcloud auth list 2>/dev/null | head -5101 ```102 Review active accounts — ensure only your Nav identity is active.103104## 3. SSH Configuration1051061. Check `~/.ssh/` directory permissions — must be `700`:107 ```bash108 stat -f "%Sp %p" ~/.ssh 2>/dev/null109 ```1102. Check private key permissions — must be `600`:111 ```bash112 find ~/.ssh -type f -name "id_*" ! -name "*.pub" -exec stat -f "%Sp %p %N" {} \;113 ```1143. Check SSH key algorithm strength — weak keys are **HIGH**:115 ```bash116 for key in ~/.ssh/id_*; do117 [ -f "$key" ] && [[ "$key" != *.pub ]] && ssh-keygen -l -f "$key" 2>/dev/null118 done119 ```120 RSA < 3072 bits → **HIGH**. DSA → **CRITICAL** (deprecated). Ed25519 or ECDSA → **PASS**.1214. SSH private keys should be encrypted — unencrypted keys are **HIGH**:122 ```bash123 for key in ~/.ssh/id_*; do124 if [ -f "$key" ] && [[ "$key" != *.pub ]]; then125 ssh-keygen -y -P "" -f "$key" &>/dev/null && echo "Unencrypted key: $key"126 fi127 done128 ```129 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).1305. Check for `ForwardAgent yes` — **HIGH** if enabled for untrusted hosts:131 ```bash132 grep -n "ForwardAgent" ~/.ssh/config 2>/dev/null133 ```134 Fix: remove `ForwardAgent yes`; use `ssh -A <host>` only when needed.1356. Check for `StrictHostKeyChecking no` — **HIGH** if set globally:136 ```bash137 grep -n "StrictHostKeyChecking" ~/.ssh/config 2>/dev/null138 ```139140## 4. Git Configuration1411421. Credential helper — `osxkeychain` or `manager` is secure; `store` is **HIGH** (plaintext); `cache` is **MEDIUM**:143 ```bash144 git config --global credential.helper145 ```1462. Plaintext credentials — must not exist (**CRITICAL**):147 ```bash148 ls -la ~/.git-credentials ~/.netrc 2>/dev/null149 ```1503. Commit signing — recommended (**INFO** if missing):151 ```bash152 git config --global commit.gpgsign153 ```1544. TLS verification — must not be `false` (**CRITICAL**):155 ```bash156 git config --global http.sslVerify157 ```1585. Pre-commit hooks — check for secret scanners (gitleaks, detect-secrets):159 ```bash160 git config --global core.hooksPath161 ```162163## 5. Credential Files1641651. Sensitive files must be `600` (owner-only). Check each that exists:166 ```bash167 for f in ~/.npmrc ~/.yarnrc.yml ~/.kube/config ~/.docker/config.json \168 ~/.pulumi/credentials.json ~/.terraform.d/credentials.tfrc.json \169 ~/.config/gh/hosts.yml ~/.aws/credentials ~/.azure/accessTokens.json \170 ~/.netrc; do171 [ -f "$f" ] && stat -f "%Sp %N" "$f"172 done173 ```174 Any file with group/other read → **HIGH**. Fix: `chmod 600 <file>`.1751762. Scan for plaintext tokens (**CRITICAL** if found):177 ```bash178 grep -l "authToken=ghp_\|authToken=npm_\|authToken=glpat-\|_password=" ~/.npmrc 2>/dev/null179 grep -l "npmAuthToken:" ~/.yarnrc.yml 2>/dev/null180 grep -l "password" ~/.pypirc ~/.netrc 2>/dev/null181 ```182 Fix: remove hardcoded tokens; use environment variables or credential helpers.1831843. Cloud provider credentials — JSON files in `~/.config/gcloud/`, `~/.aws/`, `~/.azure/` should be `600`:185 ```bash186 find ~/.config/gcloud ~/.aws ~/.azure -name "*.json" -o -name "credentials" 2>/dev/null | \187 xargs -I{} stat -f "%Sp %N" {} 2>/dev/null188 ```189190## 6. Shell Configuration1911921. History files must be `600`:193 ```bash194 stat -f "%Sp %p" ~/.zsh_history ~/.bash_history 2>/dev/null195 ```1962. History privacy — sensitive commands should be excludable (**INFO** if not set):197 - zsh: `grep HIST_IGNORE_SPACE ~/.zshrc`198 - bash: `grep HISTCONTROL ~/.bashrc`1993. Secrets in shell profiles — scan for hardcoded API keys, tokens, passwords (**HIGH** if found):200 ```bash201 grep -nE '^\s*export\s+\w*(API_KEY|SECRET|_TOKEN|PASSWORD|AWS_SECRET|GITHUB_TOKEN|NPM_TOKEN|PRIVATE_KEY)\s*=' \202 ~/.zshrc ~/.zprofile ~/.zshenv ~/.bashrc ~/.bash_profile ~/.profile 2>/dev/null203 ```2044. Remote code execution patterns — `curl | bash` in profiles (**MEDIUM**):205 ```bash206 grep -nE 'curl\s.*\|\s*(ba)?sh|wget\s.*\|\s*(ba)?sh' \207 ~/.zshrc ~/.zprofile ~/.bashrc ~/.bash_profile 2>/dev/null208 ```209 Note: `eval "$(brew shellenv)"` and `eval "$(mise activate)"` are standard and safe.210211## 7. Network Exposure2122131. Services listening on all interfaces (0.0.0.0) — flag anything unexpected (**MEDIUM**):214 ```bash215 lsof -i -P -n 2>/dev/null | grep LISTEN | grep -v '127.0.0.1\|::1' | awk '{print $1, $9}' | sort -u216 ```217 Known safe: rapportd (Apple Handoff), Tailscale/IPNExtension (VPN), ControlCenter (AirPlay — disable if unused).218 Dev servers (node, python) on 0.0.0.0 should bind to 127.0.0.1 instead.2192202. Firewall exceptions — review for stale entries:221 ```bash222 /usr/libexec/ApplicationFirewall/socketfilterfw --listapps 2>/dev/null | head -1223 ```224 Flag if >30 exceptions (**INFO**). Remove stale entries in System Settings → Firewall → Options.225226## 8. Package Managers & Developer Tools2272281. **npm** — check TLS and script settings:229 ```bash230 npm config get strict-ssl 2>/dev/null231 npm config get ignore-scripts 2>/dev/null232 ```233 `strict-ssl=false` → **HIGH** (TLS disabled). `ignore-scripts` absent → **INFO**.2342352. **pip** — check for TLS bypass:236 ```bash237 python3 -m pip config list 2>/dev/null | grep -E 'trusted-host|index-url'238 ```239 `trusted-host` set → **HIGH** (TLS bypassed). Custom `index-url` not pointing to pypi.org → **MEDIUM**.2402413. **Go** — check checksum verification:242 ```bash243 go env GONOSUMCHECK GONOSUMDB GOFLAGS 2>/dev/null244 ```245 Non-empty GONOSUMCHECK → **MEDIUM** (checksum verification bypassed).2462474. **Docker** — check for plaintext credentials:248 ```bash249 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/null250 ```251 Plaintext `auth` or `password` in `auths` → **HIGH**. Using `credHelpers` or `credsStore` → **PASS**.2522535. **Homebrew** — list third-party taps for awareness:254 ```bash255 brew tap 2>/dev/null | grep -v '^homebrew/'256 ```257 Review for unexpected taps → **INFO**.2582596. **VS Code** — list extensions for review:260 ```bash261 code --list-extensions 2>/dev/null | wc -l262 ```263 Review for extensions from unknown publishers → **INFO**.264265## 9. Outdated Software266267Outdated tools can contain known vulnerabilities. Check each package manager for pending updates.2682691. **Homebrew formulae** — check for outdated packages:270 ```bash271 brew outdated 2>/dev/null272 ```273 Security-critical tools outdated (trivy, gitleaks, zizmor, git) → **MEDIUM**. Others → **INFO**. Fix: `brew upgrade`.2742752. **Homebrew casks** — check for outdated applications:276 ```bash277 brew outdated --cask 2>/dev/null278 ```279 Outdated browsers or naisdevice → **MEDIUM**. Others → **INFO**. Fix: `brew upgrade --cask`.2802813. **npm global packages**:282 ```bash283 npm outdated -g 2>/dev/null284 ```285 Outdated → **INFO**. Fix: `npm update -g`.2862874. **pip packages**:288 ```bash289 pip3 list --outdated 2>/dev/null290 ```291 Outdated → **INFO**. Fix: `pip3 install --upgrade <package>`.2922935. **mise/asdf runtimes**:294 ```bash295 mise outdated 2>/dev/null296 ```297 Outdated → **INFO**. Fix: `mise upgrade`.2982996. **macOS system updates**:300 ```bash301 softwareupdate -l 2>/dev/null302 ```303 Pending security updates → **MEDIUM**. Other updates → **INFO**. Fix: `softwareupdate -ia`.304305## Report Format306307Summarize all findings in a table:308309```310| Severity | Category | Finding | Remediation |311|----------|-------------|--------------------------------------|-----------------------|312| CRITICAL | Credentials | Plaintext token in ~/.npmrc | Remove token, use env |313| HIGH | SSH | ForwardAgent enabled for 'myhost' | Remove from config |314| PASS | FileVault | Disk encryption enabled | |315```316317End 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").318319## Related320321| Resource | Use For |322|----------|---------|323| `@security-champion` | Trusselmodellering, compliance, Navs sikkerhetsarkitektur |324| `@security-review` | Sikkerhetssjekk av kodeendringer før commit/push |325| `$nav-auth` | JWT-validering, TokenX, ID-porten, Maskinporten |326| `$nais` | Nais-manifest, accessPolicy, hemmeligheter |327| [sikkerhet.nav.no](https://sikkerhet.nav.no) | Navs Golden Path og autoritative sikkerhetsretningslinjer |