Nine Go vulnerabilities including memory corruption (CVE-2026-27143), crypto/tls deadlocks, and path traversal. Learn to check, patch, and mitigate without updating. Includes automation scripts, Docker lab, and AppArmor rules. Practical SUSE, RHEL, Ubuntu commands.
On April 14, 2026, SUSE released an update for go1.25 fixing nine CVEs. The most severe: CVE-2026-27143 (memory corruption after bound check elimination, CVSS 9.8) and CVE-2026-27140 (trust layer bypass in cgo/SWIG, CVSS 8.8). Also fixed: crypto/tls deadlocks (CVE-2026-32283), path traversal in os.Root.Chmod (CVE-2026-32282), and archive/tar unbounded allocation (CVE-2026-32288).
But here's the thing: this won't be the last memory corruption bug in Go. Use this guide to build a repeatable process.
How to Check If You Are Vulnerable (Commands for SUSE, RHEL, Ubuntu, Alpine)
1. Check Go version
go version # Vulnerable: go1.25.0 through go1.25.8 # Fixed: go1.25.9 or higher
2. Check if your binaries were compiled with a vulnerable Go toolchain
# Find all Go binaries and check their build version find /usr/local/bin /usr/bin ~/bin -type f -executable -exec sh -c 'go version -m "$1" | head -1' _ {} \; 2>/dev/null | grep -E "go1\.25\.[0-8]"
3. SUSE-specific check (zypper)
zypper info go1.25 | grep Version # If Version < 1.25.9 -> vulnerable # Check if patch is already applied zypper patch-check --cve=CVE-2026-27143
4. Ubuntu / Debian (if using golang-1.25 from backports)
apt show golang-1.25-go 2>/dev/null | grep Version # Compare against 1.25.9-*
5. RHEL / Fedora (EPEL or custom repo)
dnf list installed go-toolset-1.25 rpm -q --qf "%{VERSION}\n" go-toolset-1.25
6. Alpine Linux (edge/community)
apk info go | grep -E "go-1\.25\.[0-8]"
Automation Script: Apply the Fix Across Major Distros
#!/bin/bash # Universal Go memory corruption fix - CVE-2026-27143 and related # Tested on: SUSE 15 SP4-7, Ubuntu 22.04/24.04, RHEL 9, Alpine 3.19 set -euo pipefail RED='\033[0;31m' GREEN='\033[0;32m' NC='\033[0m' echo "=== Go Memory Corruption Fix (CVE-2026-27143 et al.) ===" # Detect distro if [ -f /etc/os-release ]; then . /etc/os-release OS=$ID VER=$VERSION_ID else echo "Cannot detect OS" exit 1 fi case $OS in suse|sles|opensuse-leap) echo "[+] SUSE detected. Applying zypper patch..." sudo zypper refresh sudo zypper patch --cve=CVE-2026-27143 --cve=CVE-2026-27140 --cve=CVE-2026-32283 ;; ubuntu|debian) echo "[+] Debian/Ubuntu detected." # If using official backports or manual install if command -v snap &>/dev/null && snap list go &>/dev/null; then sudo snap refresh go --channel=1.25/stable else echo "Manual install required: download go1.25.9.linux-amd64.tar.gz from golang.org" wget https://go.dev/dl/go1.25.9.linux-amd64.tar.gz sudo rm -rf /usr/local/go && sudo tar -C /usr/local -xzf go1.25.9.linux-amd64.tar.gz echo 'export PATH=$PATH:/usr/local/go/bin' >> ~/.bashrc fi ;; rhel|centos|fedora) echo "[+] RHEL/Fedora detected." if command -v dnf &>/dev/null; then sudo dnf update go-toolset-1.25 -y else sudo yum update go-toolset-1.25 -y fi ;; alpine) echo "[+] Alpine detected." sudo apk update && sudo apk upgrade go ;; *) echo "Unsupported OS. Manual update: https://go.dev/dl/go1.25.9.linux-amd64.tar.gz" exit 1 ;; esac # Verify fix NEW_VER=$(go version | awk '{print $3}' | sed 's/go//') if [[ "$NEW_VER" > "1.25.8" ]] || [[ "$NEW_VER" == "1.25.9" ]]; then echo -e "${GREEN}[✓] Fixed! Go version: $(go version)${NC}" else echo -e "${RED}[✗] Still vulnerable. Version: $NEW_VER < 1.25.9${NC}" exit 1 fi # Recompile your critical Go apps echo "[+] Rebuilding local Go binaries..." go clean -cache go install -a std echo "Done. Recompile your projects with 'go build -a'"
Alternative Mitigation If You Can't Update Now
# Limit TLS handshake frequency per IP sudo iptables -A INPUT -p tcp --dport 443 -m state --state NEW -m recent --set sudo iptables -A INPUT -p tcp --dport 443 -m state --state NEW -m recent --update --seconds 60 --hitcount 10 -j DROP
2. AppArmor profile to block os.Root.Chmod symlink escape (CVE-2026-32282)
cat <<EOF | sudo tee /etc/apparmor.d/block-chmod-symlink profile go-restricted /usr/bin/mygoapp { capability dac_override, / r, /** r, deny /**/symlink_target/** w, # Prevent chmod following symlinks out of root deny /proc/*/fd/** w, } EOF sudo apparmor_parser -r /etc/apparmor.d/block-chmod-symlink
proxy_read_timeout 10s; proxy_connect_timeout 5s; client_body_timeout 10s; # Limits certificate chain length ssl_verify_client off;
# Use bsdtar which has different parsing limits bsdtar -tf suspicious.tar 2>&1 | head -1000 # Or use gtar with memory limit ulimit -v 500000 && tar -tf suspicious.tar

Nenhum comentário:
Postar um comentário