1

В Unix переменная IFS часто использовалась для нарушения целостности системы.
Как это было исправлено?
Единственный ответ, который я нашел, находится на странице Википедии http://en.wikipedia.org/wiki/Internal_field_separator, которая гласит:
«Это было исправлено тем, что оболочки не наследовали переменную IFS».

Я могу проверить это в моей системе 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
$

Этого достаточно, чтобы избежать повышения привилегий? Как я могу использовать IFS для разрыва абсолютных путей внутри системных вызовов ()?

1 ответ1

0

Либо исполняемый файл, вызывающий системный вызов (), уже превратил имя пути в компоненты (что, как я думаю, вы подразумеваете под "break") и использовал элементы $ IFS (обычно пробел) для разделения компонентов, либо сценарий оболочки, вызываемый system () сама манипулирует $ IFS.

Пример исполняемого файла, разбивающего путь:

#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);
} 

Пример вызванного скрипта, "ломающего" путь:

#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);
} 

... с ./my_script.sh, содержащим

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .