MakuluLinux Ships a Persistent Backdoor in Every Installation

Severity: CRITICAL  |  Disclosure Date: January 28, 2026  |  Researcher: Steven Stobo

Summary

The MakuluLinux operating system installs a binary that establishes a persistent connection to a command-and-control server owned by the developer. This is not a third-party compromise. The backdoor is embedded in the OS installer itself.

Evidence Chain

1
install-script.bin (the OS installer) copies /usr/share/MakuluSetup/files/check.bin to /usr/bin/check.bin
2
Creates autostart entry disguised as "System Health Check" with 30-second delay
3
check.bin (9.5MB stripped ELF) establishes persistent TCP connection to 217.77.8.210:2006
4
That IP resolves to makulu.online — the developer's own domain
5
Installer error handling references: "One or more critical final file operations (startup/check.bin) failed" — confirming it is a required install component

C2 Infrastructure

AssetIPHostingRegistrant Location
C2 Server217.77.8.210:2006Contabo GmbH, DEGermany
makulu.online217.77.8.210Contabo GmbHDa Nang, Vietnam
makululinux.eu207.180.233.66Contabo GmbHRedacted
makululinux.com64.20.42.243Trouble-free.netEastern Cape, South Africa
The C2 server and makulu.online resolve to the same IP address (217.77.8.210). This links the backdoor directly to the developer's own infrastructure.

Additional Insecure Practices

Developer Attribution

MakuluLinux 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.

Embedded SaaS Platform

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.

Server Port Map — 217.77.8.210 (makulu.online)

PortProtocolServiceUsed By
2006Raw TCPC2 Backdoorcheck.bin
2006HTTPSAI chat/ask APIcalculator, weather, editor, frames, image-gen
4002HTTPSImage processingimage2image
6003HTTPSAI chat APItext-image, video, video-gen, log, pie, update-manager
6004HTTPAI ask APIsong
7005HTTPLicense verificationverification.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.

Data Collection

Remediation

If 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.

Update: February 1, 2026 — Update Mechanism Analysis

Additional analysis was performed on a fresh MakuluLinux LinDoz 2026 installation. The update mechanism was examined while actively running on a live system.

Update Loop (update-check)

An infinite loop runs every 5 minutes, calling check-patchlist:

while sleep 5m
do
  /usr/share/MakuluSetup/check-patchlist
done

Script Self-Replacement (check-patchlist)

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.

Binary Download with Unrestricted Permissions (quick-patch)

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"

Persistent User Prompt

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.

Summary of findings: The update mechanism downloads arbitrary scripts over unencrypted HTTP, replaces its own code with whatever the server provides, downloads unsigned binaries with unrestricted permissions, and presents a non-dismissible prompt to the user. This provides the developer with persistent, renewable remote code execution capability on every installation.

Analysis conducted on the researcher's own hardware. Scripts preserved as evidence. Remediation applied immediately after documentation.

Full Technical Analysis on GitHub →