2 Commits

Author SHA1 Message Date
Mason Rowe
7d27d65cb3 update binary workflows to poll virustotal for scan completion 2026-09-19 21:42:37 -04:00
Mason Rowe
e29813716c update binary workflows to grab github-hosted toolchain assets 2026-09-19 21:25:18 -04:00
2 changed files with 44 additions and 26 deletions

View File

@@ -86,9 +86,12 @@ jobs:
yum install -y yum-plugin-ovl # fix for docker overlay fs yum install -y yum-plugin-ovl # fix for docker overlay fs
yum install -y xz yum install -y xz
# download musl cross compilation toolchain # download musl cross compilation toolchain - mirrored as a release asset on
# this repo since musl.cc blocks GitHub Actions IP ranges (musl.cc fallback
# kept for local runs)
cd ~ cd ~
curl -L -4 --retry 5 --retry-delay 2 --connect-timeout 15 "https://musl.cc/$CROSS-cross.tgz" -o "$CROSS-cross.tgz" curl -fL -4 --retry 5 --retry-delay 2 --connect-timeout 15 "https://github.com/masonr/yet-another-bench-script/releases/download/toolchains/$CROSS-cross.tgz" -o "$CROSS-cross.tgz" \
|| curl -fL -4 --retry 5 --retry-delay 2 --connect-timeout 15 "https://musl.cc/$CROSS-cross.tgz" -o "$CROSS-cross.tgz"
tar xf "$CROSS-cross.tgz" tar xf "$CROSS-cross.tgz"
# download, compile, and install libaio as static library # download, compile, and install libaio as static library
@@ -192,18 +195,20 @@ jobs:
echo "${filename}:${analysis_id}" >> analysis_ids.txt echo "${filename}:${analysis_id}" >> analysis_ids.txt
done done
# Wait 2 minutes for scans to complete
echo "Waiting 2 minutes for VirusTotal scans to complete..."
sleep 120
- name: Retrieve VirusTotal scan results - name: Retrieve VirusTotal scan results
id: get-results id: get-results
run: | run: |
ALL_CLEAN=true ALL_CLEAN=true
# Poll each analysis until it completes; VirusTotal scans can take a few
# minutes after upload, so allow up to ~5 minutes per binary (10 polls,
# 30s apart) before giving up. Files are processed sequentially, so by
# the time the first completes the rest are usually already done.
while IFS=':' read -r filename analysis_id; do while IFS=':' read -r filename analysis_id; do
echo "Retrieving results for $filename (ID: $analysis_id)..." echo "Retrieving results for $filename (ID: $analysis_id)..."
status="queued"
for ((attempts=1; attempts<=10; attempts++)); do
# Get scan results # Get scan results
result_response=$(curl -4 --retry 5 --retry-delay 2 --connect-timeout 15 -s --request GET \ result_response=$(curl -4 --retry 5 --retry-delay 2 --connect-timeout 15 -s --request GET \
--url "https://www.virustotal.com/api/v3/analyses/$analysis_id" \ --url "https://www.virustotal.com/api/v3/analyses/$analysis_id" \
@@ -211,6 +216,10 @@ jobs:
--header "x-apikey: ${{ secrets.VIRUSTOTAL_API_KEY }}") --header "x-apikey: ${{ secrets.VIRUSTOTAL_API_KEY }}")
status=$(echo "$result_response" | jq -r '.data.attributes.status // "unknown"') status=$(echo "$result_response" | jq -r '.data.attributes.status // "unknown"')
[ "$status" = "completed" ] && break
echo "$filename still scanning (attempt $attempts of 10), waiting 30s..."
sleep 30
done
if [ "$status" = "completed" ]; then if [ "$status" = "completed" ]; then
malicious=$(echo "$result_response" | jq -r '.data.attributes.stats.malicious // 0') malicious=$(echo "$result_response" | jq -r '.data.attributes.stats.malicious // 0')
@@ -232,7 +241,7 @@ jobs:
echo "| $filename | $status_text | $malicious | $suspicious | $undetected | [$file_hash]($vt_url) |" >> scan_results.md echo "| $filename | $status_text | $malicious | $suspicious | $undetected | [$file_hash]($vt_url) |" >> scan_results.md
else else
echo "| $filename | ⏳ Pending | N/A | N/A | N/A | Scan not completed |" >> scan_results.md echo "| $filename | ⏳ Timed out | N/A | N/A | N/A | Scan did not complete in ~5 min |" >> scan_results.md
ALL_CLEAN=false ALL_CLEAN=false
fi fi

View File

@@ -88,9 +88,12 @@ jobs:
yum install -y yum-plugin-ovl # fix for docker overlay fs yum install -y yum-plugin-ovl # fix for docker overlay fs
yum install -y xz yum install -y xz
# download musl cross compilation toolchain # download musl cross compilation toolchain - mirrored as a release asset on
# this repo since musl.cc blocks GitHub Actions IP ranges (musl.cc fallback
# kept for local runs)
cd ~ cd ~
curl -L -4 --retry 5 --retry-delay 2 --connect-timeout 15 "https://musl.cc/$CROSS-cross.tgz" -o "$CROSS-cross.tgz" curl -fL -4 --retry 5 --retry-delay 2 --connect-timeout 15 "https://github.com/masonr/yet-another-bench-script/releases/download/toolchains/$CROSS-cross.tgz" -o "$CROSS-cross.tgz" \
|| curl -fL -4 --retry 5 --retry-delay 2 --connect-timeout 15 "https://musl.cc/$CROSS-cross.tgz" -o "$CROSS-cross.tgz"
tar xf "$CROSS-cross.tgz" tar xf "$CROSS-cross.tgz"
# Activate Holy Build Box exe compilation environment # Activate Holy Build Box exe compilation environment
@@ -193,18 +196,20 @@ jobs:
echo "${filename}:${analysis_id}" >> analysis_ids.txt echo "${filename}:${analysis_id}" >> analysis_ids.txt
done done
# Wait 2 minutes for scans to complete
echo "Waiting 2 minutes for VirusTotal scans to complete..."
sleep 120
- name: Retrieve VirusTotal scan results - name: Retrieve VirusTotal scan results
id: get-results id: get-results
run: | run: |
ALL_CLEAN=true ALL_CLEAN=true
# Poll each analysis until it completes; VirusTotal scans can take a few
# minutes after upload, so allow up to ~5 minutes per binary (10 polls,
# 30s apart) before giving up. Files are processed sequentially, so by
# the time the first completes the rest are usually already done.
while IFS=':' read -r filename analysis_id; do while IFS=':' read -r filename analysis_id; do
echo "Retrieving results for $filename (ID: $analysis_id)..." echo "Retrieving results for $filename (ID: $analysis_id)..."
status="queued"
for ((attempts=1; attempts<=10; attempts++)); do
# Get scan results # Get scan results
result_response=$(curl -4 --retry 5 --retry-delay 2 --connect-timeout 15 -s --request GET \ result_response=$(curl -4 --retry 5 --retry-delay 2 --connect-timeout 15 -s --request GET \
--url "https://www.virustotal.com/api/v3/analyses/$analysis_id" \ --url "https://www.virustotal.com/api/v3/analyses/$analysis_id" \
@@ -212,6 +217,10 @@ jobs:
--header "x-apikey: ${{ secrets.VIRUSTOTAL_API_KEY }}") --header "x-apikey: ${{ secrets.VIRUSTOTAL_API_KEY }}")
status=$(echo "$result_response" | jq -r '.data.attributes.status // "unknown"') status=$(echo "$result_response" | jq -r '.data.attributes.status // "unknown"')
[ "$status" = "completed" ] && break
echo "$filename still scanning (attempt $attempts of 10), waiting 30s..."
sleep 30
done
if [ "$status" = "completed" ]; then if [ "$status" = "completed" ]; then
malicious=$(echo "$result_response" | jq -r '.data.attributes.stats.malicious // 0') malicious=$(echo "$result_response" | jq -r '.data.attributes.stats.malicious // 0')
@@ -233,7 +242,7 @@ jobs:
echo "| $filename | $status_text | $malicious | $suspicious | $undetected | [$file_hash]($vt_url) |" >> scan_results.md echo "| $filename | $status_text | $malicious | $suspicious | $undetected | [$file_hash]($vt_url) |" >> scan_results.md
else else
echo "| $filename | ⏳ Pending | N/A | N/A | N/A | Scan not completed |" >> scan_results.md echo "| $filename | ⏳ Timed out | N/A | N/A | N/A | Scan did not complete in ~5 min |" >> scan_results.md
ALL_CLEAN=false ALL_CLEAN=false
fi fi