July 1st, 2024

Userland Rootkits Are Lame

Userland rootkits like Symbiote pose a threat on Linux systems by injecting libraries to hide information. Countermeasures include using statically linked binaries for immunity, examining memory layouts, and comparing file lists.

Read original articleLink Icon
Userland Rootkits Are Lame

The article discusses userland rootkits, focusing on a specific Linux threat called Symbiote. Userland rootkits operate at the same privilege level as defenders, making them a nuisance but manageable. The rootkit injects a library into processes using LD_PRELOAD to hide information, filter process and file lists, and evade detection by tools like ldd. However, these techniques can be countered by using statically linked binaries like busybox, which are immune to infection via dynamic linkers or modified libraries. Additional detection methods include examining memory layouts, stack variables, and comparing file lists directly from disk structures. The article concludes that userland rootkits are weak and can be effectively neutralized by using statically compiled binaries. Overall, the discussion highlights the limitations of userland rootkits and provides insights into detecting and mitigating their impact.

Link Icon 8 comments
By @grugq - 5 months
Author here.

The context of this post is somewhat important. It is a direct response to a post titled: Symbiote Deep-Dive: Analysis of a New, Nearly-Impossible-to-Detect Linux Threat

Userland rootkits are not “nearly-impossible-to-detect.” They are not novel, they are not impossible to detect, and they are not the pinnacle of hacker techniques.

I felt that it was worth pointing out that the history of userland rootkits goes back a ways and that they were very easy to detect because they rely on proxying all access to the system. If you bypass the hook they use to enter their proxy, they you evade them entirely.

Forensic and incident response guides used to advise using static linked binaries for exactly this reason. There are guides from the 1990s telling people to do this because userland rootkits were an issue (before kernel rootkits everyone used userland rootkits.)

Here is an example from 2013 which points out that you can’t trust any binaries/libraries on the potentially compromised machine and should use statically linked tools. [0]

LD_PRELOAD rootkits are not new and they are not nearly-impossible-to-detect to detect. My post listed a number of ways to detect them, all of which have been known for decades.

[0] https://www.forensicfocus.com/forums/general/trusted-static-...

By @mike_d - 5 months
Adversaries live by the saying "if it works it isn't stupid."
By @notepad0x90 - 5 months
ld_preload is the lazy way of doing userland rootkits. there are other ways.

For example, you can patch libc, and by patch I mean there are different ways of patching. a simply binary patch is unreliable because it'd be pinned to a specific version but you can parse the elf symbols dynamically and patch them, even when libc is updated (assuming certain critical symbols are unlikely to ever change) so it becomes reliable. a lot of "static" programs still dynamically load libc.

There is also a more aggressive but easily detectable approach, just patch every elf file on the system so that that the _start/entry always does something to prevent discovery of the malware like messing with the plt so that all function calls are proxied through rootkit code, where the rootkit filters for parameters and return values it doesn't like.

Kernel rookits are great but secure boot is also a thing, if implemented correctly it would be very difficult to beat. you don't even have to go full on rootkit, just a stealthy implant running as root via a hijacked dynamic library (doesn't have to be libc) will do. this isn't windows, it's not like there is a reliable/common way of making sure system libraries are legit (like authenticode/pe signing). The package managers make sure the correct binaries are being installed but they don't have something like sfc on windows (system file checker) that refuses to let the system boot if files are corrupt and/or restore tampered system executables.

By @rascul - 5 months
Is it really practical to just statically compile everything so you don't get a rootkit? Is that really the solution?
By @alkonaut - 5 months
If it’s weak, I’d expect a standard distribution to detect it by itself and inform the user.

Only revealing itself to a defender who looks for it sounds like it’ll be working as intended in almost all cases.

By @benob - 5 months
What are uses of LD_PRELOAD that make us keep it?
By @from-nibly - 5 months
This sounds like a food youtuber trying to explain how easy cooking a Turkey is. Yeah sure in a vaccum maybe, but I don't spend all day cooking food. Ive got other stuff to do.

Maybe its easy to find rootkits if you know what you are doing and use a statically compiled tcpdump. Do you know how many times I've done a TCP dump on my computer to check for root kits statically compiled or not? 0. I don't spend my time doing that. All it has to do is use less CPU and RAM than my corporate anti virus already does ( which is a lot ) and I'm never going to find it, cause im never gonna look.