Repository navigation
Expand file tree
/
Copy pathaur-audit
More file actions
executable file
·140 lines (116 loc) · 5.04 KB
/
Copy pathaur-audit
File metadata and controls
executable file
·140 lines (116 loc) · 5.04 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
#!/usr/bin/env bash
# aur-audit - Interactive Zero-Trust AUR Package Auditor v2.1.0
set -euo pipefail
# --- Configuration Paths ---
CFG_DIR="${XDG_CONFIG_HOME:-$HOME/.config}/py-agent"
[[ -d "$CFG_DIR" ]] || CFG_DIR="${XDG_CONFIG_HOME:-$HOME/.config}/local-ai"
AUDIT_SKILL_FILE="${CFG_DIR}/skills/system/aur-audit.md"
ALIAS_AI_SCRIPT="${CFG_DIR}/ai-agent.py"
# 1. Display Dedicated AUR Audit Skill Profile (if available)
if [[ -f "$AUDIT_SKILL_FILE" ]]; then
cat "$AUDIT_SKILL_FILE"
echo ""
echo "---"
echo ""
fi
# 2. Package Name Resolution (CLI argument or interactive prompt)
PKG_NAME="${1:-}"
if [[ -z "$PKG_NAME" ]]; then
read -e -p "❯ Enter AUR package name to audit: " PKG_NAME
fi
# Trim whitespace
PKG_NAME="$(echo -e "${PKG_NAME}" | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')"
if [[ -z "$PKG_NAME" ]]; then
echo "❌ Error: No package name was provided." >&2
exit 1
fi
# Sanitize package name (standard Arch alphanumeric + valid separators)
if [[ ! "$PKG_NAME" =~ ^[a-zA-Z0-9][a-zA-Z0-9_@.+-]*$ ]]; then
echo "❌ Error: Invalid package name format: '$PKG_NAME'" >&2
exit 1
fi
# 3. Secure Git Clone with Animated Spinner
TEMP_DIR="$(mktemp -d)"
trap 'rm -rf "$TEMP_DIR"' EXIT INT TERM
printf "⠋ Fetching AUR repository for: \033[1;33m%s\033[0m...\r" "$PKG_NAME" >&2
# Run git clone in the background
git clone --depth 1 "https://aur.archlinux.org/${PKG_NAME}.git" "$TEMP_DIR" >/dev/null 2>&1 &
CLONE_PID=$!
spin='⠋⠙⠹⠸⠼⠴⠦⠧⠇⠏'
i=0
while kill -0 "$CLONE_PID" 2>/dev/null; do
i=$(( (i + 1) % 10 ))
printf "\r%s Fetching AUR repository for: \033[1;33m%s\033[0m..." "${spin:$i:1}" "$PKG_NAME" >&2
sleep 0.08
done
wait "$CLONE_PID" || {
printf "\r\033[2K❌ [CRITICAL ERROR] Failed to retrieve package data for '%s'.\n" "$PKG_NAME" >&2
echo " Verify your network connection and ensure the package exists on https://aur.archlinux.org" >&2
exit 1
}
# Clear spinner line immediately
printf "\r\033[2K" >&2
# 4. Extract Package Metadata & Ancillary Script Assets
METADATA=""
if [[ -f "$TEMP_DIR/.SRCINFO" ]]; then
while IFS='=' read -r key val; do
key="$(echo "$key" | tr -d '[:space:]')"
val="$(echo "$val" | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')"
if [[ -n "$key" && -n "$val" ]]; then
case "$key" in
pkgdesc) METADATA="${METADATA}* **Description**: ${val}"$'\n' ;;
pkgver) METADATA="${METADATA}* **Version**: ${val}"$'\n' ;;
url) METADATA="${METADATA}* **Upstream URL**: \`${val}\`"$'\n' ;;
license) METADATA="${METADATA}* **License**: ${val}"$'\n' ;;
depends) METADATA="${METADATA}* **Runtime Dep**: \`${val}\`"$'\n' ;;
makedepends) METADATA="${METADATA}* **Build Dep**: \`${val}\`"$'\n' ;;
source) METADATA="${METADATA}* **Declared Source**: \`${val}\`"$'\n' ;;
esac
fi
done < "$TEMP_DIR/.SRCINFO"
fi
# Main PKGBUILD Script
if [[ ! -f "$TEMP_DIR/PKGBUILD" ]]; then
echo "❌ Error: PKGBUILD was not found in the cloned repository." >&2
exit 1
fi
PKGBUILD_CONTENT="$(cat "$TEMP_DIR/PKGBUILD")"
# Discover all supplementary scripts (.install, .service, .sh)
ANCILLARY_SCRIPTS=""
while IFS= read -r -d '' asset; do
base="$(basename "$asset")"
if [[ "$base" != "PKGBUILD" && "$base" != ".SRCINFO" && ! -d "$asset" ]]; then
# Exclude large binary blobs
if file "$asset" | grep -qv "text"; then
ANCILLARY_SCRIPTS="${ANCILLARY_SCRIPTS}"$'\n\n'"#### [Binary File Asset]: \`${base}\`"$'\n'"*(Omitted binary blob)*"
else
content="$(cat "$asset")"
ANCILLARY_SCRIPTS="${ANCILLARY_SCRIPTS}"$'\n\n'"#### [Embedded Script]: \`${base}\`"$'\n\`\`\`bash\n'"${content}"$'\n\`\`\`'
fi
fi
done < <(find "$TEMP_DIR" -maxdepth 1 -not -name '.git' -print0)
# 5. Formulate Zero-Trust Audit Prompt
PROMPT="Please perform a comprehensive zero-trust security audit on this AUR package build recipe.
### Zero-Trust Evaluation Checklist:
1. **Network Integrity**: Check if build() or package() initiates arbitrary external network downloads bypassing source array.
2. **Obfuscation & Sudo**: Flag any hidden base64 decoding, eval, curl | bash, chown/chmod root escalations, or telemetry hooks.
3. **Upstream Authenticity**: Verify whether the declared source download URL matches the authentic developer repository.
4. **Install Hook Safety**: Inspect pre/post-install routines for persistent daemon installation or crontab modifications.
### 1. Package Metadata Overview
$METADATA
### 2. Primary PKGBUILD Recipe
\`\`\`bash
$PKGBUILD_CONTENT
\`\`\`"
if [[ -n "$ANCILLARY_SCRIPTS" ]]; then
PROMPT="${PROMPT}
### 3. Ancillary Package Scripts & Install Hooks
${ANCILLARY_SCRIPTS}"
fi
# 6. Dispatch to AI Agent or Context Stream
if [[ "${AI_CONTEXT_RUN:-0}" -eq 1 ]]; then
echo "$PROMPT"
else
echo -e "\033[2m[sys] Auditing '${PKG_NAME}' with zero-trust AI profile...\033[0m" >&2
python3 "$ALIAS_AI_SCRIPT" --talk "$PROMPT" --aur-audit
fi