переменная среды ifs не наследуется

в 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 для ломать абсолютные пути внутри системных () вызовов?

26
задан user2431763
28.02.2023 6:46 Количество просмотров материала 3095
Распечатать страницу

1 ответ

либо исполняемый файл, вызывающий system (), уже превратил путь в компоненты (что, как я думаю, вы подразумеваете под "разрывом") и использовал элементы $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  into path components
elements=()
echo "${elements[@]}"
IFS="$oldIFS"
0
отвечен Stephen P. Schaefer 2023-03-01 14:34

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх