install-script.bin (the OS installer) copies /usr/share/MakuluSetup/files/check.bin to /usr/bin/check.bincheck.bin (9.5MB stripped ELF) establishes persistent TCP connection to 217.77.8.210:2006| Asset | IP | Hosting | Registrant Location |
|---|---|---|---|
| C2 Server | 217.77.8.210:2006 | Contabo GmbH, DE | Germany |
| makulu.online | 217.77.8.210 | Contabo GmbH | Da Nang, Vietnam |
| makululinux.eu | 207.180.233.66 | Contabo GmbH | Redacted |
| makululinux.com | 64.20.42.243 | Trouble-free.net | Eastern Cape, South Africa |
chmod +x and executed with sudo every 5 minutesverification.bin phones home to makulu.online:7005 over HTTPMakuluLinux is developed and maintained by a single individual: Jacque Montague Raymer, operating from Da Nang, Vietnam (previously Eastern Cape, South Africa). The project has been active since 2009.
All server infrastructure (C2, update distribution, AI API proxying, license verification) runs on Contabo GmbH VPS instances registered to the same developer.
Beyond the backdoor, analysis reveals MakuluLinux functions as a delivery vehicle for a centralized AI-as-a-service platform. Over 40 compiled Python binaries proxy requests through the developer's VPS to upstream providers (OpenAI, HuggingFace). The OS is the distribution mechanism; the AI features are the monetized product.
| Port | Protocol | Service | Used By |
|---|---|---|---|
| 2006 | Raw TCP | C2 Backdoor | check.bin |
| 2006 | HTTPS | AI chat/ask API | calculator, weather, editor, frames, image-gen |
| 4002 | HTTPS | Image processing | image2image |
| 6003 | HTTPS | AI chat API | text-image, video, video-gen, log, pie, update-manager |
| 6004 | HTTP | AI ask API | song |
| 7005 | HTTP | License verification | verification.bin, frames, editor |
Port 2006 serves dual purposes: HTTPS for legitimate AI API calls, and raw TCP for the check.bin backdoor. The API is the front-facing service. The raw socket is the undisclosed control channel.
weather.bin geolocates every user via ipinfo.io and ipapi.co before API callsimage2image.bin maintains persistent user sessions on the serverIf you are running MakuluLinux, execute the following to neutralize the backdoor and insecure update mechanism:
# Kill the backdoor process
sudo kill $(pgrep -f check.bin)
# Delete the binary and staging copy
sudo rm -f /usr/bin/check.bin /usr/share/MakuluSetup/files/check.bin
# Delete the autostart entry
rm -f ~/.config/autostart/System-Health-Check.desktop
# Block the C2 server
sudo iptables -A OUTPUT -d 217.77.8.210 -j DROP
# Block domains in /etc/hosts
echo "0.0.0.0 makulu.online" | sudo tee -a /etc/hosts
echo "0.0.0.0 makululinux.eu" | sudo tee -a /etc/hosts
# Disable insecure update scripts
sudo chmod -x /usr/share/MakuluSetup/check-patchlist
sudo chmod -x /usr/share/MakuluSetup/update-check
sudo chmod -x /usr/share/MakuluSetup/quick-patch
# Post-remediation: change ALL passwords, regenerate SSH keys,
# and migrate to a trusted Linux distribution.
Additional analysis was performed on a fresh MakuluLinux LinDoz 2026 installation. The update mechanism was examined while actively running on a live system.
An infinite loop runs every 5 minutes, calling check-patchlist:
while sleep 5m
do
/usr/share/MakuluSetup/check-patchlist
done
check-patchlist downloads replacement scripts from the developer's server over plain HTTP with no signature verification:
wget -r -nH -l1 --no-parent --reject "index.html*" \
http://makululinux.eu/rsync-ubuntu/lindoz-u/patch-number/ \
/usr/share/MakuluSetup/
The downloaded files overwrite the currently running scripts, including quick-patch and 5-patcher-rsync. This means any code the server delivers will execute with the user's privileges (including sudo) within the next 5-minute cycle. The use of plain HTTP makes this trivially exploitable via man-in-the-middle.
The quick-patch script downloads compiled binaries from makulu.online and sets them to chmod 777 (world-readable, writable, and executable):
smart_sync_file "https://makulu.online/ai/weather/weather.bin" \
"/usr/share/MakuluSetup/weather/weather.bin" "777"
smart_sync_file "https://makulu.online/ai/calculator/calculator.bin" \
"/usr/share/MakuluSetup/calculator/calculator.bin" "777"
smart_sync_file "https://makulu.online/ai/image/image-gen.bin" \
"/usr/share/MakuluSetup/tools/image-gen.bin" "777"
If the user declines the update prompt, the script retries every 300 seconds indefinitely:
while true; do
if zenity --question --title="System Updates" \
--text="New AI system patches are available..."; then
return 0
else
sleep 300
fi
done
The user cannot permanently dismiss the update. The prompt will continue to appear until accepted.
Analysis conducted on the researcher's own hardware. Scripts preserved as evidence. Remediation applied immediately after documentation.
Full Technical Analysis on GitHub →