ifs a variável de ambiente não é herdada

1

No Unix, a variável IFS costumava ser usada para subverter a integridade do sistema.
Como foi consertado?
A única resposta que encontrei está na página da wikipedia link que diz:
"Isso foi corrigido fazendo com que as shells não herdam a variável IFS."

Eu posso verificar isso no meu sistema Debian 6:

$ export IFS=/  
$ printf "%s" "$IFS" | od -bc
0000000 057
          /
0000001
$ bash
bash-$ printf "%s" "$IFS" | od -bc
0000000 040 011 012                     # default values
             \t  \n
0000003
bash-$ exit
exit
$ 
$ printf "%s" "$IFS" | od -bc
0000000 057
          /
0000001
$

É o suficiente para evitar o aumento de privilégios? Como posso usar o IFS para quebrar nomes de caminhos absolutos dentro de chamadas do system ()?

    
por user2431763 06.02.2014 / 18:29

1 resposta

0

Ou o executável que faz a chamada system () já transformou o nome do caminho em componentes (que é o que você entende por "quebra") e usou $ IFS (geralmente espaço) para separar os componentes ou o shell script ser invocado por system () manipulará o $ IFS em si.

Exemplo do executável dividindo o caminho:

#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#define MAX_TOKENS 100
#define COMMAND "echo "
int main() {
  char path[]       = "/file/system/path";
  char *delims      = "/";
  int  i            = 1;
  char *token;
  char broken_path[sizeof(COMMAND) + sizeof(path) + 3*MAX_TOKENS];

  strcpy(broken_path, COMMAND);

  token = strtok(path, delims);
  while(i < MAX_TOKENS) {
    if (token == NULL) {
      break;
    }
    strcat(broken_path,"'");
    strcat(broken_path, token);
    strcat(broken_path, "' ");
    token = strtok(NULL, delims);
  }
  printf("%s\n", broken_path);
  return system(broken_path);
} 

Um exemplo do script chamado "quebrando" o caminho:

#include <stdlib.h>
#include <stdio.h>
#define MAX_TOKENS 100
#define COMMAND "./my_script.sh "
int main() {
  char path[]       = "/file/system/path";
  char broken_path[sizeof(COMMAND) + sizeof(path) + 2];

  sprintf(broken_path, "%s %s", COMMAND, path);
  return system(broken_path);
} 

... com ./my_script.sh contendo

#!/bin/sh
oldIFS="$IFS"
declare -a elements
IFS="/"
# break $1 into path components
elements=($1)
echo "${elements[@]}"
IFS="$oldIFS"
    
por 03.11.2018 / 04:08