Доброе утро, господа и дамы… На картинки пока НЕ смотрим, всё станет прозрачным чуть позже.

Создаём подопытный файл под рутом:

echo 'some text' > test.txt

Затариваем его:

tar -cf test.tar test.txt

Теперь открываем в hexdump:

hexdump -C test.tar

Так, открыли. Смотри первую картинку к этому посту. Видишь root/root? Это имя владельца и имя группы файла. Так вот, при создании архива эти поля можно изменять.

Давай изменим:

tar --owner='bash' --group='days' -cf test.tar test.txt

Окей. Снова открываем в hexdump:

hexdump -C test.tar

Смотрим вторую картинку. На ней видим интересную ситуацию: пользователь изменился на bash, а группа — на days. Но в системе у нас нет такого пользователя и группы. Хотя ожидаемый результат должен быть — user/group not found или что-то подобное.

-rw-r--r-- bash/days 10 2023-10-23 05:09 test.txt

Баг или фича? Причём, если растарить такой файл с ключом -p или без него, bash/days вернутся к root/root.

А теперь создадим с user/user — этот пользователь и группа есть в системе.

tar --owner='user' --group='user' -cf test.tar test.txt

Распаковываем:

tar -xf test.tar

И видим ситуацию, что у файла test.txt пользователь и группа user/user. Великолепно! Вот такое интересное поведение.

Из документации по tar: по смещениям 108 и 116 находятся uid и gid.

char uid[8]; /* 108 */
char gid[8]; /* 116 */

Давай посмотрим смещение 108:

hexdump -Cs108 -n8 test.tar

Получаем:

0000006c 30 30 30 31 37 35 30 00 |0001750.|00000074

Конвертим 0001750 в uid:

echo $(( 8#1750 ))

Опа, получили 1000, что соответствует пользователю user. А если этот трюк провернуть с bash/days, то получим uid того пользователя, под которым тарили файл.

Роман Шубин
Роман Шубин
CEO & CTO, Главред в «Цифровой улей»
Задать вопрос
Короче, как всегда, везде есть свои нюансы и приколы, возможно, обоснованные. Глубже копать не стал.

Давай, увидимся вечерком!