GNU/Linux >> Znalost Linux >  >> Linux

Co dělá ENV („_“) pro ochranu před laděním?

Bash nastavuje proměnnou prostředí _ na cestu k příkazu, který se provádí. Stejně tak zsh a pdksh. Ale jiné shelly, jako fish and dash (což je výchozí skriptovací shell na mnoha distribucích Linuxu), to nedělají. ATT ksh jej nastaví na hodnotu, která obsahuje cestu k příkazu.

Myšlenka je, že program může zkontrolovat hodnotu proměnné prostředí _ abych viděl, co to vyvolalo, myslím. Až na to, že je to extrémně nespolehlivé, i když uživatel nedělá nic, aby to změnil. Pokud je program spuštěn z GUI nebo pomocí skriptu, _ může být prázdný nebo může mít nějakou zcela nesouvisející hodnotu, a to je naprosto legitimní a velmi běžné. A samozřejmě, pokud to uživatel chce změnit, je to naprosto triviální – stačí spustit env -u _ myprogram nebo env myprogram .

Vzhledem k tomu, že opatření proti ladění jdou, je toto docela směšné. Nejen, že je spoofovatelný s nulovou námahou, ale při běžném používání by vlastně ani nefungoval. Pokud to nějaký materiál ke čtení nabízí jako opatření proti ladění, doporučil bych tento materiál jako velmi nespolehlivý.


V tomto kontextu _ Proměnná prostředí bude obvykle obsahovat cestu k debuggeru, který spustil program, spíše než samotný program. Program, který se pokouší detekovat ladicí program, pak může číst tuto proměnnou a chovat se jinak, pokud ladicí program uvidí (možná vyhledáním známých názvů ladicího programu jako gdb nebo porovnáním s argv[0] ).

Zde je příklad, který ukazuje tuto proměnnou v akci a jak se liší od argv[0] :

C kód:

#include <stdlib.h>
#include <stdio.h>

int main(int argc, char *argv[]) {
    char *path = getenv("_");
    printf("%s\n", argv[0]);
    printf("%s\n", path);
    return 0;
}

Výstup shellu:

$ gcc -o main main.c
$ ./main
./main
./main
$ gdb main
...
(gdb) r
Starting program: /home/user/tmp/main
/home/user/tmp/main
/usr/bin/gdb
[Inferior 1 (process 21694) exited normally]
(gdb)

POZNÁMKA:Toto není jedinečné pro Linux, můžete to udělat na macOS a pravděpodobně i na jiných systémech POSIX.

TAKÉ:Jedná se o opravdu levný trik, který lze opravdu snadno obejít a má vysokou šanci, že nebude fungovat tak, jak bylo zamýšleno (falešně pozitivní i falešně negativní).


Linux
  1. Co znamená „–“ (dvojitá pomlčka)?

  2. Co znamená „rc“ v .bashrc?

  3. Co dělá Exec 3?

  1. Co dělá program, když je odeslán signál Sigkill?

  2. Co znamená Etc?

  3. Co Libgl_always_indirect=1 ve skutečnosti dělá?

  1. Co dělá poll() s časovým limitem 0?

  2. Co dělá 'bash -c'?

  3. Co dělá zabít -- -0?