Penetration Testing Cheat Sheet
Environment Variables in Linux: Red Team Exploits and Blue Team Defenses
Environment variables are a foundational concept in Linux-like systems, providing a way to store configuration values, session settings, and system-wide preferences.
They are both powerful tools for legitimate administration and potential attack vectors when misused.
In this article, we'll cover:
- Basics of environment variables
- Legitimate usage in Linux
- Red team exploitation techniques
- Blue team defense strategies
- Practical code samples
Understanding Environment Variables
Environment variables are key-value pairs that affect the way running processes behave. They can be system-wide or per-user session.
Example of listing environment variables:
printenv
# or
envExample of setting an environment variable:
export MY_VAR="HelloWorld"
echo $MY_VARVariables can also be set temporarily for a single command:
MY_VAR="TempValue" ./my_programCommon environment variables:
PATH— search path for executable filesHOME— user's home directoryLD_LIBRARY_PATH— dynamic linker search pathUSER— current usernameSHELL— current shell path
Red Team Usage and Attacks
From an offensive security perspective, environment variables can be manipulated to achieve privilege escalation, persistence, or data exfiltration.
PATH Hijacking
If a privileged script or binary executes a command without specifying the full path, attackers can modify PATH to run their own malicious executable.
# Attacker sets malicious PATH
export PATH="/tmp/malicious:$PATH"
# Create malicious ls binary
echo -e '#!/bin/bash\necho "Owned!"' > /tmp/malicious/ls
chmod +x /tmp/malicious/ls
# Now 'ls' runs attacker's script if executed by victim
lsLD_PRELOAD Injection
Attackers can preload malicious shared libraries before executing binaries.
export LD_PRELOAD=/tmp/malicious.soIf the target program does not sanitize LD_PRELOAD, the malicious .so file runs first.
Information Leakage
Sensitive credentials (API keys, database passwords) are sometimes stored in environment variables. Red teams can harvest them via:
cat /proc/$PID/environSSH Backdoor via Environment Variables
Attackers can use AuthorizedKeysCommand in sshd_config to fetch keys from an environment variable source.
Environment variables can be abused to create a stealthy SSH backdoor by influencing how sshd loads authorized keys. Normally, SSH keys are stored in ~/.ssh/authorized_keys, but sshd can be configured to fetch keys dynamically using the AuthorizedKeysCommand directive in /etc/ssh/sshd_config. If this command reads keys from an environment variable—passed at session start or set globally in /etc/environment—an attacker with write access could insert their own public key without touching the authorized keys file, bypassing traditional file integrity checks. For example, in a test VM, you could create a script /usr/local/bin/getkeys.sh that simply prints the contents of an $SSH_BACKDOOR_KEY environment variable, set that variable to contain your public key, and configure AuthorizedKeysCommand /usr/local/bin/getkeys.sh with AuthorizedKeysCommandUser root. After restarting sshd, any client with the matching private key would gain SSH access. This technique works because the key source is abstracted, making it harder to detect—ideal for a red team proof-of-concept. Defensively, blue teams should avoid dynamic key loading from environment variables and strictly control sshd_config permissions.
Blue Team Best Practices
Restrict and Sanitize PATH
- Always use absolute paths in scripts:
/usr/bin/ls- Do not include writable directories in
PATHfor privileged users.
Clear Sensitive Variables
Unset sensitive environment variables before running privileged commands:
unset API_KEY
unset PASSWORDDisable Dangerous Variables
In /etc/sudoers:
Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
Defaults env_resetMonitor and Audit
- Use
auditdto monitor environment variable changes. - Regularly check
/proc/$PID/environfor suspicious variables.
Example audit rule:
auditctl -a always,exit -F arch=b64 -S execve -k env_watchLimit LD_PRELOAD and LD_LIBRARY_PATH Abuse
- Set
ld.soconfigs to ignore these variables for privileged binaries (/etc/ld.so.preload). - Use
noexecmount option for/tmpand/dev/shm.
Summary
Environment variables are integral to Linux systems, but they can be weaponized if left unchecked. Red teams exploit them for stealth, privilege escalation, and persistence, while blue teams must enforce strict path usage, sanitize sensitive variables, and monitor for abnormal changes.
By combining operational hygiene with active monitoring, defenders can drastically reduce the risk of environment variable abuse.