Добро пожаловать, Гость. Пожалуйста авторизуйтесь здесь.
FGHIGate на GaNJa NeTWoRK ST@Ti0N - Просмотр сообщения в эхоконференции RU.GOLDED
Введите FGHI ссылку:


Присутствуют сообщения из эхоконференции RU.GOLDED с датами от 16 Jul 13 03:28:02 до 25 May 24 07:08:24, всего сообщений: 3569
Ответить на сообщение К списку сообщений Предыдущее сообщение Следующее сообщение
= Сообщение: 2599 из 3569 ======================================== RU.GOLDED =
От   : Nil A                            2:5015/46          13 Aug 23 07:03:34
Кому : Vitaliy Aksyonov                                    13 Aug 23 07:03:34
Тема : Golded SIGABRT
FGHI : area://RU.GOLDED?msgid=2:5015/46+64d8570d
На   : area://RU.GOLDED?msgid=1:104/117+64d677f6
= Кодировка сообщения определена как: CP866 ==================================
==============================================================================
Hello, Vitaliy!

Friday August 11 2023 12:02, from Vitaliy Aksyonov -> Nil A:

NA>> Чё-то, где-то. про Скан Клуджей. Я сейчас просто тут это оставлю,
NA>> разбираться ночью с этим багом я не буду, не on-call я сегодня по
NA>> голдеду.
VA> Так неспортивно. А Steps to reproduce? Ну или корку на крайняк.

Ларчик легко открывался.
TLDR; надо бы все strcat() в коде на strncat() заменить, а иначе классический buffer overflow.

Сейчас будут детали бага, заодно расскажу, какие тулы мне в такие моменты приходят на ум.

Имеется - хорошее воспроизведение бага. При поиске "Enter Searchstring (Header+Text)", по hobbit.test, у меня shift+f, или option+f кнопка, вводим пофиг что. Как оказалось, не пофиг размер окна терминала, т.е. $COLUMNS у меня сейчас 148, если совсем маленький, или совсем широкий, то не воспроизводится баг.

Начинаем ковырять, собираем из гитхаб мастера с -O0 -g. Напускаем gdb, видим, что в разных функциях, где передаётся *Gmg msg, и потом, когда достают msg->lin, то там оказывается всегда одинаковое фиксированное значение, и это явно за пределами памяти.

(gdb) up 2
#2  0x00000000004852e9 in MsgLineReIndex (msg=0xd893cc, viewhidden=0, viewkludge=0, viewquote=1)
    at /home/fido/src/golded-plus/golded3/geline.cpp:3111
3111        throw_xrelease(msg->line);
(gdb) p msg->lin
$1 = (Line *) 0xd9ced9d2cfe720d5
(gdb) p *msg->lin
Cannot access memory at address 0xd9ced9d2cfe720d5

Сначала я в gdb пытался watch разные ставить, чтобы отловить, кто туда пишет. Оказалось, что мой линукс в виртуалке, которая на OpenVZ, ещё и плохо с хардварными вочпоинтами дружит, типа не пермишен.

Потом я думал, что отловлю на ASAN билде, кто в какую память пишет не так. Но там всё совсем плохо оказалось, я уже писал ранее. Хотя, сейчас понимаю, что рано сдался, надо было с ASAN_OPTIONS=halt_on_error=0 пускать, и он бы прошагал дальше.

Потом я запустил под valgrind, который, сначала обругался, что у нас в if выражениях используются значения неинициализованных переменных, в районе Initialize->ReadKeysCfg. Потом ругань на несоответствия free() / delete / delete [], которые я уже видел на ASAN билде. Кстати, может кто-нибудь это всё вычистит?

И вот тут звёзды сошлись. Valgrind сказал, что пишем за пределы вот тут
by 0x48156C: ScanKludges(GMsg*, int) (geline.cpp:1743)
Там вот такая строчка
strcat(msg->origin, line->next->txt.c_str());

И, как и ожидалось, в структурке GMsg, за "char origin[160]" (который оказался чуть-чуть длинноватым в сообщении), следующее поле "Line* lin". Таким образом этот указатель съезжает на левый адрес, а дальше разыменование указателя это UB.

Best Regards, Nil
--- GoldED+/LNX 1.1.5
* Origin: Linux 2.6.32-042stab145.3 (2:5015/46)

К главной странице гейта
Powered by NoSFeRaTU`s FGHIGate
Открытие страницы: 0.034104 секунды