1.1, Анонин (?), 22:50, 22/05/2023 [ответить] [﹢﹢﹢] [ · · · ]
| –4 +/– |
> beh.c
> char scheme[1024]
> '\0'
Действительно, что же могло пойти не так //_-
| |
|
2.25, Аноним (-), 01:59, 23/05/2023 [^] [^^] [^^^] [ответить]
| +2 +/– |
> "';/usr/bin/id;'' #.pdf".
Вообще-то это system() многострадальный - к си относится только тем что из си это можно использовать. Так стреляют пятки и на многих других ЯП которые вывешивают system() или сравнимый "упрощенный" интерфейс пуска программ.
И проблема тут не в си а в том что кроить упрощенному интерфейсу запуска программ параметры из передаваемых пользователем значений - дело гиблое и на этом кто только не налетал, от CGI интерфейсов на всем чем угодно до всяких питоняш и жабистов.
Общая идея атаки: если програмер вызывает внешнюю программу через подобный интерфейс и получает от пользователя на вход какие-то данные, можно попробовать оформить эти данные в виде когда "команда шелла" получится очень сильно отличной по смыслу от оригинального замысла. Вон та строка завершает параметры "слишком рано" по мнению шелла, начинает новую команду, и...
| |
|
3.30, Аноним (30), 11:36, 23/05/2023 [^] [^^] [^^^] [ответить]
| +/– |
Как будто, из самого правильного языка невозможно вызвать эту злосчастную system().
| |
|
4.37, Аноним (-), 19:38, 23/05/2023 [^] [^^] [^^^] [ответить]
| +/– |
Собственно исходники на сях имеет смысл прицельно сканировать на наличие вызова system и сильно думать насколько оно легитимно и безопасно в том или ином случае. Для сетевой программы, с параметрами от пользователя это одна из самых глупых идей. По тем же причинам шелскриптам не стоит давать параметры от недоверяемого ремотного пользователя. Слишком много специальной трактовки разных символов - и это вообще-то к шеллу, что он так работает, со стороны сей тут никаких проблем нет - что дали то и выполнили. А то что для шелла эти закорюки имели специальные значения - ну и вот при чем тут си, если это шелл вообще специальной трактовкой символов на@#$вается? Классика жанра.
| |
|
5.43, Ivan_83 (ok), 13:24, 24/05/2023 [^] [^^] [^^^] [ответить]
| +/– |
А причём тут С?
Отсутствие/недостаточная фильтрация входных данных - частая болезнь в разных продуктах на разных языках.
Даже там где есть готовые функции для такой проверки/очистки - их периодически забывают вызывать.
Помимо system() нефильтрованный ввод ещё попадает в *printf*() и *SQL*() и там тоже нехило разносит всё.
Частая ошибка передавать такое в open(), все вебсервера через это проходили.
Подозреваю даже что openat() могло появится только ради этого ))))
| |
|
6.44, Аноним (-), 22:36, 24/05/2023 [^] [^^] [^^^] [ответить]
| +/– |
> А причём тут С?
Только при том что я его знаю, поэтому знаю что для него сканировать надо :). Вот прямо system. Лучше poison'ом его gcc'шным, или типа того. Если в программе вызовы system() есть это уже повод напрячься в общем случае. Особенно если оно что-то делает с внешними данными при этом. Легитимных и безопасных поводов для system() в коде вообще не так уж много. Шелл очень капризная пакость чтобы ему внешние данные скармливать вообще.
А как это делать в каком-нибудь ruby, java или чем там еще - пусть специалисты в них и разбираются. И, если хотят, тут и пишут.
И да, разумеется, чтобы не скучать есть еще SQL-инъекции. Или вон даже directory traversal обыкновенный. Вот тут кстати стандартизаторы подгадили - все эти ../../etc/passwd довольно канительно и грабельно отфильтровывать так то. Ну вот буквально каждый второй вебсервер норовит все и вся отсервировать по первости, например.
| |
|
|
|
|
|
|
2.3, Аноним (3), 23:13, 22/05/2023 [^] [^^] [^^^] [ответить]
| –4 +/– |
Купс это что-то из набора штатных бэкдоров, как и гхостскрипт. Сишники тут ни при чём.
| |
|
|
|
5.26, Аноним (26), 02:05, 23/05/2023 [^] [^^] [^^^] [ответить]
| +/– |
Код в котором встречается system() вообще особого доверия не заслуживает. Если кто видит в коде system() - есть нехилый шанс что там вулн, если параметры подконтрольны пользователю. Это касается вообще любого яп где это или нечто сравнимое есть.
| |
|
4.38, Аноним (-), 19:39, 23/05/2023 [^] [^^] [^^^] [ответить]
| +/– |
Он в этом случае виноват только тем что шелл вызвал. Шелл на#$%лся на хитром эскейпинге. И вопросы тут к шеллу и его синтаксису так то на самом деле. А к сишнику вопрос только "нафига это было?"
| |
|
|
2.14, Ivan_83 (ok), 00:23, 23/05/2023 [^] [^^] [^^^] [ответить]
| +10 +/– |
Чувак, причём тут С и строки?
Автор кода получил строку по сети и отправил её в system(), не проведя никаких проверок и очисток.
Можно на джаве, го, расте написать тоже самое.
На пхп постоянно так делают и там SQL инекции случаются, именно это близкий аналог данной ошибки.
| |
|
3.34, Аноним (2), 15:16, 23/05/2023 [^] [^^] [^^^] [ответить]
| +/– |
Действительно, можно такое написать на чём угодно, но написано на Си. И все эти проблемы с санитизацией ввода растут из отсутствия вменяемых способов работы со строками в Си. Как следствие, сишники не воспринимают строки иначе, чем массив байтов. Неназванное не может быть познано.
| |
|
4.36, Ivan_83 (ok), 16:23, 23/05/2023 [^] [^^] [^^^] [ответить]
| +1 +/– |
Нет.
Вы сами себе придумали строки а потом жалуетесь что с ними нечем работать.
Почти все веб сервера написаны на С и как то справились с очисткой входных данных.
Есть куча всяких кодеков и пр что работает с бинарными данными и обработки там намного сложнее.
В данном случае надо смотреть, мне кажется там вообще не было смысла брать пользовательские данные, а можно было генерить рандомный уникальный идентификатор.
| |
|
5.40, Аноним (2), 20:19, 23/05/2023 [^] [^^] [^^^] [ответить]
| +/– |
> Вы сами себе придумали строки а потом жалуетесь что с ними нечем работать
Вот именно про это я и говорю: неназванное. Очень уж напоминает языки некоторых примитивных племён, где нет слов для определённых цветов и — о чудо — носители языка эти цвета не различают.
> Почти все веб сервера написаны на С и как то справились с очисткой входных данных
Ты совершенно прав, и про то, как именно справлялись с очисткой данных можно почитать в предыдущих томах этой саги.
| |
|
6.42, Ivan_83 (ok), 13:19, 24/05/2023 [^] [^^] [^^^] [ответить]
| +/– |
Вы синтаксический сахар нужный для обработки строк возводите в мастхэв максимум.
На практике же всё сводится к тому чтобы найти уже готовое решение которое где то имплементировано и оттестировано.
| |
|
7.46, Аноним (-), 22:42, 24/05/2023 [^] [^^] [^^^] [ответить]
| +/– |
Интересно за какой он синтаксический сахар топит? Кто-то заморочился позатыкать проблемы шелла на уровне либы? И если да - это для каких шеллов работает? Потому что шелл так то тоже не мировая константа. А какой-нибудь bash при необдуманном вызове позволяет и еще стрельнуть по пяткам добавочными способами. Рут по DHCP подтвердит.
| |
|
|
|
4.39, Аноним (-), 20:12, 23/05/2023 [^] [^^] [^^^] [ответить]
| +/– |
Если вызвать шелл с вон теми закорючками из другого ЯП - результат будет тот же самый. Чем тут си виноват? Что шелл позволяет вызывать чтоли? И кто из ЯП так уж прямо заморачивается санитизацией параметров для вот именно posix shell например?
| |
|
5.41, Аноним (2), 20:20, 23/05/2023 [^] [^^] [^^^] [ответить]
| +/– |
Если… Эх, вот только если… Но вызвали из Си и получили то, что получили.
| |
|
6.45, Аноним (-), 22:38, 24/05/2023 [^] [^^] [^^^] [ответить]
| +/– |
Есть полно случаев когда вызывают и не из си, получая то же самое по смыслу. Вот прям таким же эксплойтом.
А си в этой схеме что предъявляется? Что он шелл запускать видите ли умеет по простому? Ну охренеть вулн :)
| |
|
|
|
|
|
1.7, хрю (?), 23:51, 22/05/2023 [ответить] [﹢﹢﹢] [ · · · ]
| –3 +/– |
в сях (да и в плюсах) работа со строками одно мучение.
Поэтому меня всегда так радуют описания нововведений в сях и плюсах, то сё, пятое десятое, а нормальной удобной стандартной библиотеки для строк нет. А уж про utf и заикаться не надо - каждый как черепашка тащит свою реализацию ... куцую и убогую.
| |
|
2.9, Аноним (3), 23:59, 22/05/2023 [^] [^^] [^^^] [ответить]
| –3 +/– |
> в сях (да и в плюсах) работа со строками одно мучение.
> Поэтому меня всегда так радуют описания нововведений в сях и плюсах, то
> сё, пятое десятое, а нормальной удобной стандартной библиотеки для строк нет.
> А уж про utf и заикаться не надо - каждый как
> черепашка тащит свою реализацию ... куцую и убогую.
Есть только ICU. В принципе есть только ICU, если ты хочешь юникод. ICU не куцая, ICU блотварь. Какие твои проблемы, всё прекрасно со строками в плюсах? В си нет строк, есть asciiz, что вполне себе неплохо и эффективно на практике. Не драматизируй, это всё вопрос привычки.
| |
|
3.13, хрю (?), 00:21, 23/05/2023 [^] [^^] [^^^] [ответить]
| +/– |
>>Не драматизируй, это всё вопрос привычки.
нет. это вопрос - качаешь исходники, пытаешься сделать патч, чтоб появилось что тебе надо. а фиг тебе. utf-а нет, строковых операций нет. Прымер - нужно название песни разбить по словам, первую букву поднять, остальные опустить. название песен на русском, янгл, фран, япон. языках. когда удобно, делается в пару строк.
>>вполне себе неплохо и эффективно на практике.
эффективно нужно там где, надо. а в других местах, должно быть удобно для программирования. какая разница сколь эффективно формируется строка запроса к капс? а по коду там огород из str func. "эффективность" во всех дырах привела к преждевременной языковой смерти :-)))
| |
3.18, Аноним (18), 00:29, 23/05/2023 [^] [^^] [^^^] [ответить]
| +/– |
> есть asciiz, что вполне себе неплохо и эффективно на практике
просто гомерический хохот. Особенно когда ждут заврешающие нули, переполняя буферы или когда их каждый раз ищут, чтобы длину посчитать.
| |
|
2.10, ИмяХ (?), 23:59, 22/05/2023 [^] [^^] [^^^] [ответить]
| +2 +/– |
Чем для тебя std::string и std:string_view ненормальны и неудобны?
| |
|
3.11, хрю (?), 00:13, 23/05/2023 [^] [^^] [^^^] [ответить]
| –3 +/– |
Это настолько же удобно, насколько удобны жигули. Так ездите на жигулях[/w][/w][/w] используйте std:string сами.
| |
|
|
5.35, BorichL (ok), 15:29, 23/05/2023 [^] [^^] [^^^] [ответить]
| –1 +/– |
Тем, что большинство современных писак програмят по принципу:
"Хочу играть на гитаре, но учиться не хочу, хочу чтоб само!" (с)
| |
|
|
3.28, Аноним (28), 09:13, 23/05/2023 [^] [^^] [^^^] [ответить]
| +/– |
Недостатком доступных методов для работы со строками. Жить можно, но неудобно.
| |
3.29, Челик с гитлаба (?), 09:48, 23/05/2023 [^] [^^] [^^^] [ответить]
| +/– |
Тем, что они не позволяют адекватно сделать посимвольный проход по строке. ASCII - ок, всё остальное это боль, мучения и тонна костылей. Попробуйте просто вывести строку "ОпенNet" посимвольно и посмотрите на кракозябры.
| |
|
2.12, Ivan_83 (ok), 00:21, 23/05/2023 [^] [^^] [^^^] [ответить]
| +1 +/– |
Самое очевидное на что не хватает ума хейтерам - это понять что никаких строк в С нет.
Есть выделенная область памяти, есть её размер и есть размер данных в ней - вот простое правило для работы с данными которые нужно интепретировать как строки.
Но в данном случае ошибка вообще про другое: данные от пользователя не достаточно проверяются/экранируются и это отдаётся в system() - те на запуск.
У пхп програмистов такое сплошь и рядом встречается, хотя строки там типа совсем безопасные.
В общем то на любом языке такая ошибка возможна, потому что никакой компелятор мамкиному кодеру не подскажет что надо данные полученные неведомо откуда перед вызовом system() проверять.
| |
|
3.15, хрю (?), 00:24, 23/05/2023 [^] [^^] [^^^] [ответить]
| +/– |
> Самое очевидное на что не хватает ума хейтерам - это понять что
> никаких строк в С нет.
да-да. формировать текстовые строки на сях нельзя, ведь их нет. поэтому придётся извращаться на радость почитателям и формировать отсутствующие строки недо str функциями. в миллионных раз изобретая велосипед.
| |
|
4.21, Ivan_83 (ok), 00:36, 23/05/2023 [^] [^^] [^^^] [ответить]
| +/– |
В чём претензия то?
Язык низкоуровневый, если вам охота обмазыватся сахаром и не думать о таких мелочах - выбирайте другой язык.
Меня лично всё устраивает, о строках я забыл лет 15 назад и счастливо живу, контролируя и размер буфера и размер данных в нём.
Всякие strn*(), strlcpy() - юзаю не часто, snprintf() всё сам делает что мне надо.
| |
|
5.27, Аноним (27), 09:08, 23/05/2023 [^] [^^] [^^^] [ответить]
| +/– |
О, еще один. У одного "ничего никогда не падало", а у этого "никогда за пределы буфера не выходит"
Прямо слет пиноккио-программеров))
| |
|
|
3.22, Аноним (18), 00:43, 23/05/2023 [^] [^^] [^^^] [ответить]
| +/– |
> Есть выделенная область памяти, есть её размер и есть размер данных в ней - вот простое правило
Но тут вдруг на данные простые вводные накладывается техника работы с завершающим нулем, унаследованная со времен бедности (когда диды-хакеры каждый байт экономили). И правила становятся непростыми, а решения - глючными и медленными. Нет чтобы хотя бы как в паскале, выделили в языке отдельные специализированные "области памяти" и хранили рядышком с каждой кол-во символов и счетчик ссылок на строку. Ведь памяти уже не 640 килобайт. Но нет, чтобы посчитать длину строки, мы будем всю ее сканировать в поисках нуля, которого может и не быть из-за разгильдяйства, это ведь так быстро.
| |
|
4.32, Аноним (32), 11:49, 23/05/2023 [^] [^^] [^^^] [ответить]
| +/– |
>Но тут вдруг на данные простые вводные накладывается техника работы с завершающим нулем
Оу, а потом программисту поступает задача из Азии, он узнаёт про unicode, UTF-16, UTF-32, и у него начинает подгорать про завершающий нуль. А затем подгорать в кошельке.
| |
|
|
2.19, YetAnotherOnanym (ok), 00:32, 23/05/2023 [^] [^^] [^^^] [ответить]
| +/– |
> а привычной для меня библиотеки для строк, как в том языке, на котором я кодил раньше, нет.
Пофиксил.
| |
|
|