Linux Environment Variables

Introduction to Linux Environment Variables

In a Linux operating system, environment variables are dynamic values that define the behavior of system processes and applications. These variables store configuration data, such as the system path, user preferences, and settings, making them essential for efficient system operations and automation.

Types of Environment Variables in Linux

1. System-Wide Environment Variables

These are available for all users and are set by the system administrator. They are defined in files such as:

  • /etc/environment

  • /etc/profile

  • /etc/bash.bashrc

2. User-Specific Environment Variables

These are defined per user and stored in:

  • ~/.bashrc

  • ~/.profile

  • ~/.bash_profile

3. Shell Variables

Shell variables exist only within the running shell session. They can be created and modified within the terminal.


Commonly Used Linux Environment Variables

  1. PATH The PATH variable defines directories where the system searches for executable files.

    echo $PATH
    export PATH=/usr/local/bin:$PATH
  2. HOME Represents the home directory of the current user.

    echo $HOME
  3. USER Stores the username of the logged-in user.

    echo $USER
  4. SHELL Specifies the default shell of the user.

    echo $SHELL
  5. EDITOR Defines the default text editor.

    export EDITOR=nano
  6. LANG Sets the system language.

    export LANG=en_US.UTF-8
  7. DISPLAY Specifies the display used by the X Window System.

    echo $DISPLAY
    export DISPLAY=:0.0
  8. HISTFILESIZE Sets the maximum number of lines contained in the history file.

    echo $HISTFILESIZE
    export HISTFILESIZE=5000
  9. HISTSIZE Defines the number of lines added to the history file per session.

    echo $HISTSIZE
    export HISTSIZE=1000
  10. HOSTNAME Stores the hostname of the computer.

    echo $HOSTNAME
  11. MAIL Specifies the location of the user’s mail spool.

    echo $MAIL
  12. MANPATH Defines the list of directories to search for manual pages.

    echo $MANPATH
    export MANPATH=/usr/local/share/man:$MANPATH
  13. OSTYPE Indicates the type of operating system.

    echo $OSTYPE
  14. PS1 Defines the default Bash prompt.

    echo $PS1
    export PS1="[\u@\h \W]\$ "
  15. PWD Stores the current working directory.

    echo $PWD
  16. TERM Specifies the current terminal type (e.g., xterm, linux).

    echo $TERM
    export TERM=xterm-256color
  17. TZ Sets the time zone.

    echo $TZ
    export TZ=America/New_York

How to View Environment Variables in Linux

1. Using the printenv Command

printenv
printenv PATH

2. Using the env Command

env

3. Using the set Command

set | less

How to Set and Export Environment Variables in Linux

1. Temporarily Setting an Environment Variable

export MY_VAR="Hello World"
echo $MY_VAR

This variable will be available only for the current session.

2. Permanently Setting an Environment Variable

To make a variable persistent, add it to ~/.bashrc or ~/.profile.

echo 'export MY_VAR="Hello World"' >> ~/.bashrc
source ~/.bashrc

How to Unset Environment Variables

To remove an environment variable:

unset MY_VAR
echo $MY_VAR  # No output

Working with Environment Variables in Scripts

Environment variables are often used in Bash scripting to automate tasks.

Example script:

#!/bin/bash
echo "The current user is: $USER"
echo "The home directory is: $HOME"

Save this as script.sh, then execute:

bash script.sh

Security Considerations for Environment Variables

  1. Avoid Storing Sensitive Data: Never store passwords in environment variables.

  2. Use readonly for Critical Variables:

    readonly SECURE_VAR="Sensitive Data"
  3. Restrict Access to Environment Files:

    chmod 600 ~/.bashrc

Interesting variables for hacking

HISTFILESIZE

Change the value of this variable to 0, so when you end your session the history file (~/.bash_history) will be deleted.

export HISTFILESIZE=0

HISTSIZE

Change the value of this variable to 0, so when you end your session any command will be added to the history file (~/.bash_history).

export HISTSIZE=0

http_proxy & https_proxy

The processes will use the proxy declared here to connect to internet through http or https.

export http_proxy="http://10.10.10.10:8080"
export https_proxy="http://10.10.10.10:8080"

SSL_CERT_FILE & SSL_CERT_DIR

The processes will trust the certificates indicated in these env variables.

export SSL_CERT_FILE=/path/to/ca-bundle.pem
export SSL_CERT_DIR=/path/to/ca-certificates

LD_PRELOAD Allows injecting shared libraries into running processes, often used for privilege escalation or bypassing security measures.

export LD_PRELOAD=/tmp/malicious.so

LD_LIBRARY_PATH Defines directories where the dynamic linker searches for shared libraries, which can be used for hijacking.

export LD_LIBRARY_PATH=/tmp/mylib:$LD_LIBRARY_PATH

PATH Manipulation Adding a malicious directory to PATH can be used for command hijacking.

export PATH=/tmp/malicious:$PATH

TMOUT Automatically logs out an idle user, useful for clearing sessions quickly.

export TMOUT=1

XDG_CONFIG_HOME Can be used to control where applications store configuration files, potentially allowing manipulation.

export XDG_CONFIG_HOME=/tmp/custom-config

IFS (Internal Field Separator) Modifying IFS can be used to change command parsing behavior in scripts.

export IFS=$'\n'

PS1 Manipulation Modify the prompt to hide the current user or create deception.

export PS1='[\u@\h \W]# '

HOME Change HOME to manipulate where programs store configurations or execute files.

export HOME=/tmp/fakehome

MAIL Modify the mail spool directory to read or redirect emails.

export MAIL=/tmp/mail

SUDO_ASKPASS Trick sudo into using a fake prompt to steal passwords.

export SUDO_ASKPASS=/tmp/fake-pass-prompt
sudo -A whoami

GDBINIT Define a malicious GDB startup file to execute arbitrary commands.

export GDBINIT=/tmp/malicious-gdbinit

Last updated

Was this helpful?