LINUX.ORG.RU
Форум — Talks  

Циклически зависимые директории в гит

 ,


0

1

Поскольку sha1 давно взломан, думаю можно организовать ситуацию чтобы две директории были взаимно вложены друг в друга. Какие интересные последствия могут быть у такой репы (ну кроме того что её невозможно checkout, впрочем на каком именно этапе checkout упадёт или зависнет - тоже интересный вопрос)? Например как отреагирует гуи гитохостингов, например гитхаба, на неё?

Мне лень всё это делать самому и проверять, а то потом опять обвинят что я вредоносные репы распространяю, вот решил обсудить исследование интересного явления публично вместо этого.

★★★★★

Git не знает ничего про директории. Пустые .gitkeep не от хорошей жизни добавляют. А так, продолжай наблюдения! ;)

beastie ★★★★★
()
Ответ на: комментарий от beastie

Как это не знает, когда есть объекты типа tree, их обозначающие? То что он пустые директории игнорирует при сканировании файловой системы это другой вопрос.

Как бы то ни было, это всё мало связано с моим вопросом.

firkax ★★★★★
() автор топика

Мне лень всё это делать самому и проверять, а то потом опять обвинят что я вредоносные репы распространяю, вот решил обсудить исследование интересного явления публично вместо этого.

Я бы ответил, да что-то лень.

Bfgeshka ★★★★★
()

Мне лень всё это делать самому и проверять

Попроси ии-шку, если лень:)

Beewek ★★★★
()

Занимательная тема с отображением одних деревьев на другие.

Что в git, что в S3 - нет никаких «директорий,каталогов,папок». Просто набор закорючек объекта/артефакта.

Так и в ФС же их нет по большому счёту. Можно и тут придумать способ сделать hard link на два разных каталога, в т.ч. вложенных друг в друга.

Лепили мы тут имитацию ФС в PostgreSQL. Куда отображаются деревья из разных источников, чтоб в итоге людям казалось, что всё это «папки». От циклических ссылок защищались и на входе и на выходе на всякий пожарный.

Toxo2 ★★★★★
()
Ответ на: комментарий от Toxo2

И тебе отвечу, в гите есть директории. Это объекты типа tree, содержание которых - массив структур:

char filemode_octal[];
char ' ';
char filename[];
char 0;
uint8 hash[20];
Рассказы про якобы их отсутствие берутся из поведения высокоуровневой части гит-клиента, который директории без файлов игнорирует и к формату его базы отношения не имеют.

Так и в ФС же их нет по большому счёту

Это уже точно демагогия.

firkax ★★★★★
() автор топика
Ответ на: комментарий от Toxo2

Можно и тут придумать способ сделать hard link на два разных каталога, в т.ч. вложенных друг в друга.

в Linux запрещены хардлинки на каталоги.

Eshkin_kot ★★
()
Ответ на: комментарий от Eshkin_kot

фс до лампочки на циклические хардлинки каталогов, ей они никак не мешают :)
думаю и в гите есть защита от циклических хардлинков :) также внешняя относительно реализации древовидной структуры псевдо-фс.

pfg ★★★★★
()
Последнее исправление: pfg (всего исправлений: 1)
Ответ на: комментарий от pfg

Думаю защиты там нет, точнее она была «заложена» криптографической стойкостью хешей, которая уже неактуальна для sha1.

firkax ★★★★★
() автор топика
Ответ на: комментарий от firkax

стойкость ключей не имеет отношения к организации структуры древовидного представления данных.
защита от циклических хардлинков каталогов «навешивается сверху» на систему.
фс, да и любой древовидной системе, до лампочки на цикличность хардлинков каталогов, работе системе она никак не мешает.

pfg ★★★★★
()
Ответ на: комментарий от pfg

Каких ключей? Если бы sha1 был стойкий то сгенерировать репу с циклическими директориями было бы невозможно, соответственно про этот аспект они скорее всего и не думали никогда. Хотя кто их знает. Ещё помню Линус вроде заявлял что нестойкость sha1 не создаёт никаких уязвимостей даже в плане подмены файлов (что очевидно неверно), что усиливает мои подозрения что они об этом даже не думали.

А реальной фс циклические хардлинки помешают тем что их удалить не получится.

firkax ★★★★★
() автор топика
Последнее исправление: firkax (всего исправлений: 1)
Ответ на: комментарий от Eshkin_kot

в Linux запрещены хардлинки на каталоги.

Это стандартными средствами запрещены. Никто же не помешает отредактировать вручную фс и всё сломать (как тс хочет сделать с гитом)

Toxo2 ★★★★★
()

Может ты имеешь ввиду не директории, а чтобы коммит A имел родителем коммит Б, а комиит Б имел родителем коммит А?

Потому что в циклических директориях вообще проблем не вижу и зачем ломать sha1 не понимаю. Сделай вручную коммит с циклическими директориями и посчитай sha1 от него.

KivApple ★★★★★
()
Последнее исправление: KivApple (всего исправлений: 1)
Ответ на: комментарий от firkax

Можно ли написать кастомный git, который будет позволять комиттить пустые папки и при этом его база будет корректно читаться обычным git?

KivApple ★★★★★
()
Ответ на: комментарий от KivApple

Кастомный гит писать не нужно, я уже выкладывал генератор любых гит-реп (правда там он для другой цели использовался, ну и касательно данной темы - брутфорсить sha1 он не умеет). А вот как гит воспримет дамп пустой директории я не знаю, может быть посчитает что это битый объект. Дамп этот вот такой: берёшь строку «tree 0\0», пакуешь методом zlib deflate, сохраняешь в объектах в .git по правильному пути.

firkax ★★★★★
() автор топика
Последнее исправление: firkax (всего исправлений: 1)
Ответ на: комментарий от KivApple

Нет, я имел ввиду именно директории: директория A содержит директорию B, а директория B содержит директорию A. Ну т.е. при его чекауте будет A/B/A/B/A/B/... до бесконечности.

Сделай вручную коммит с циклическими директориями и посчитай sha1 от него.

Как его. по-твоему, сделать вручную не ломая sha1? У каждой директории свой sha1, и его надо знать чтобы её добавить в другую.

Идея с коммитами кстати тоже интересная и может быть даже более продуктивная в плане вызова интересных эффектов в гит-софте. Например, опять же, что там покажет гитхаб в истории коммитов. Или сделать git blame на правку, которой в этом цикле нет (он будет должен бесконечно ходить между коммитами).

firkax ★★★★★
() автор топика
Ответ на: комментарий от KivApple

Проверил.

Пустая директория имеет хэш 4b825dc642cb6eb9a060e54bf8d69288fbee4904. Гит такие директории при чекауте не создаёт. Так же он не создаёт директории, у которых всё вложенное дерево в итоге заканчивается на пустых директориях (без файлов).

Однако, git fsck на них не ругается, так же как и git show или git ls-tree.

Можешь сам проверить, распакуй архив ниже в директорию .git/objects/ только что созданной репы (git init), затем сделай git checkout 77c98ab03dc8c3aa81f7953b68b0de1c4755a19e - посмотреть что получится, а затем (или до этого) вот такие команды:

git ls-tree 77c98ab03dc8c3aa81f7953b68b0de1c4755a19e
git ls-tree 77c98ab03dc8c3aa81f7953b68b0de1c4755a19e topdir/
git ls-tree 77c98ab03dc8c3aa81f7953b68b0de1c4755a19e topdir/emptydir_level2/
git ls-tree 77c98ab03dc8c3aa81f7953b68b0de1c4755a19e topdir/emptydir_level2/emptydir1/
git show 4b825dc642cb6eb9a060e54bf8d69288fbee4904
По ним видно что гит прекрасно видит пустые директории на уровне самой базы, но просто игнорирует их при коммитах/чекаутах.

Архив:

begin 644 objs.tgz
M'XL(`````````^W9;VB551P'\&>^&+3"9A#^8=)-$7)JGO]_H+)F#DW,.0BJ
M-WG.<\XSLD%IKJY%;P;AFW(I2UG=BJ94]D>'1@,#"R)-47.P5=0RHADS+"=&
MMFK1V6@@%]H-[O;<&_T^;Q[N\UPXY_"%+[_[7,R61E,-!9+ST2N6'%UY'1=A
M3H20F$@<[N/P'$<9/N4["UH>W6PV93+AZC?A";\W\?/_*,R6:NVMIXJ1A'OL
MG-8ZYM0S&0MN8\,4MT(95<0:HP$+QOXY?\GS\N>,A_S1I)UR`O_S_+.Y10OO
M6G,/8EWK$8ZF/=W;W[KC>/N)><LK+[SV17SWZY<>NWEE]H>1[[[<L^V;"[?<
MU]`W:\:K1V:]-2<Z\1/I+_7F0=&H*\O^)YQ"_Z<AY,\-1S1A2!"'M;*,46<Y
M$CPVDLA$4<Z\=$D1:Q3L?R[R^W\L?^C_J3?>_P<<8@A1O&YEG!67>\ZOF;E?
M/_GX0_L6M1W:.+AJ[="=T4CCM<.EWBV8;#0IT_[GT/]I"/E33XQ%AAGCK-#6
M,F40Y8DS1*LX]M0A:HDN8HV"_2_R\^>2<NC_-(SWOTC&QO\=?[2&X;]RZ\ZM
MU[TX[X7N)3.^?IO(SG-]N_<VM53,?;EZ6:GW"R870V79_U@BZ/\TA/P5\Q@K
M2[A2U`K#,+>4,.W"9^*-)YK'CK@BUBC4_YBR_/X?>_\'_3_U_N[_+F2O?/W3
M^6NN]T!OS?S*[1W[;^@>/'KL3&Y+[ZF1>W]>V#;XS/75SV=6G.U8,/OB@QUZ
M[S7OK:OX9?JJF4W-&P_/?>Z)-]\XK`>&GXKZZN9_7^JS@<*8+<O^)YQ`_Z<A
MY*\(=[%@)+;"6VW"-.XYLXER0A.E$NL]TX@5L4;!^1_+_/[G84'H_Q2,S__K
MHZAJ\;2*4F\'I$S*\NQ_!/V?BI!_K)6QB+I8Q=08A1.I>?@AH"QR'L<L)&>P
M]D6L47#^#\-^_O^_4D+_IR&;>_;D'54?9:IO[]EWZ\?GW^]0<VA#W<.-]2\U
MW%A??7#PQ]5?7;WYLFQ[Y?YW_(<#P^10[>GZ#0LZU?::IFT]2UH'NA?OW-7>
M3AK?;1ZH^?2S;_M._:GVU/;?MN7S6O^`J6I>/G2PY9$5=>S<[[-_^P"=O6GW
M)].7;3AS<A<[7>J#@S%>E&?_<PG]GX:0OW:>:&N)PTXPRJRR1!LO)3=.Q<0S
M%7.JBSDZS/_E*YM;??S8VL;1^?^JKHJA4F\'````````````````````````
1````````_\)?#C0(`0!0````
`
end

firkax ★★★★★
() автор топика
Последнее исправление: firkax (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему: только для зарегистрированных, score>=50.