O getauxval pode ser usado para determinar se você está ou não sendo rastreado?

3

Saindo de esta pergunta , eu atualizei meu kernel em uma missão para fazer o SQL Server 2017 no Linux comece. Agora estou ficando mais longe, mas estou sendo desligado,

strstr("TracerPid:\t0\n", "TracerPid:")                                                                 = "TracerPid:\t0\n"
strtol(0x7fe0cf01840b, 0x7ffd380d5eb0, 10, 0)                                                           = 0
free(0x7fe0cf018400)                                                                                    = <void>
fclose(0x7fe0cf011980)                                                                                  = 0
getpid()                                                                                                = 3474
getpid()                                                                                                = 3474
getauxval(31, 9, 5, 0x7fe0d034ea67)                                                                     = 0x7ffd380dcfe0
strncpy(0x7ffd380d5f00, "/opt/mssql/bin/sqlservr", 4095)                                                = 0x7ffd380d5f00
realpath(0x7ffd380d5f00, 0x7ffd380d6f00, 0, 0x7fe0d0323720)                                             = 0x7ffd380d6f00
getpid()                                                                                                = 3474
abort( <no return ...>
--- SIGABRT (Aborted) ---

Acredito que depois de ter verificado o proc , o SQL Server faz algum outro voodoo para fazer a mesma coisa que um fallback, apenas para ser "extra-seguro" que ninguém está tentando fazer seu software funcionar.

Agora, estou me perguntando se getauxval(3) pode ser usado para determinar também se um processo está sendo rastreado? Parece que o CAPABILITIES indica que isso é possível em CAP_SYS_ADMIN e CAP_SYS_PTRACE

    
por Evan Carroll 03.01.2018 / 20:56

1 resposta

2

Eu acredito que o primeiro argumento para GETAUXVAL() diz algo,

getauxval(31, 9, 5, 0x7fe0d034ea67)

Abertura /usr/include/x86_64-linux-gnu/bits/auxv.h , eu posso ver isso

#define AT_EXECFN       31              /* Filename of executable.  */

Então, eles estão tentando obter o nome do arquivo do executável - na verdade, o nome do caminho pelos documentos e o exemplo abaixo. Nesse caso, esse é o nome do caminho do rastreador e não o alvo. Eles estão chamando realpath para garantir que os caminhos sejam os mesmos. Você pode ver o que é getauxval()

$ LD_SHOW_AUXV=1 strace sleep 1
AT_SYSINFO_EHDR: 0x7ffd6d96f000
AT_HWCAP:        bfebfbff
AT_PAGESZ:       4096
AT_CLKTCK:       100
AT_PHDR:         0x5640b6cad040
AT_PHENT:        56
AT_PHNUM:        9
AT_BASE:         0x7fc9ce4fc000
AT_FLAGS:        0x0
AT_ENTRY:        0x5640b6d09440
AT_UID:          1000
AT_EUID:         1000
AT_GID:          1000
AT_EGID:         1000
AT_SECURE:       0
AT_RANDOM:       0x7ffd6d909669
AT_HWCAP2:       0x0
AT_EXECFN:       /usr/bin/strace
AT_PLATFORM:     x86_64
    
por 03.01.2018 / 21:04