Если ваша работа не связана с безопасностью, я не думаю, что вас попросят об этом. Идентификация уязвимостей относительно проста, но использовать их сложно, и я думаю, что большинство работодателей были бы счастливы, зная, что вы знаете, что вам нужно проверить свои границы.
billjamesdev explains раскрытие информации через переполнение, и это в основном то, о чем шла речь в Heartbleed. Тем не менее, есть намного худшие возможные результаты, самые известные из которых являются произвольными, удаленное выполнение кода: в основном, кто-то еще запускает любой код, который им нравится в вашей программе из-за уязвимости программного обеспечения. Переполнение буфера на основе стека легче использовать для получения RCE, но буферы на основе кучи также могут быть использованы в некоторой степени.
В этой маленькой функции:
int foo() {
char bar[4];
}
Массив bar
живет в стеке. Еще одна интересная вещь, которая живет в стеке, является адресом возврата функции. Если вы перепишете этот адрес, когда функция вернется, он переместится в выбранное вами место, а не там, где разработчик решил, что он вернется. Скажите, что у вас есть эти две функции:
int main() {
char bar[4];
scanf("Enter no more than 4 characters: %s\n", bar);
}
int bar() {
system("sh"); // starts a shell on Linux
}
и предположить, что bar
живет в адресном 0x41414141 (что весьма маловероятно, но это делает демонстрацию легче, потому что 0x41 является кодом ASCII для «A»). Если запустить эту программу на Linux и ввода этого:
Enter no more than 4 characters: 00001111AAAA
На x86, это будет заполнить буфер символов с ASCII нулями, перезаписать специальное значение, называемое указателем базового кадра родителя (это очень важно для вашей программы но хакерам обычно не нужно заботиться об этом) с помощью ASCII и перезаписывать обратный адрес 0x41414141
.Когда main
вернется, вместо прекращения программы он запустит оболочку.
Существует множество вариантов атак, но основная идея заключается в том, что переполнение буфера может позволить хакерам захватить поток выполнения вашей программы.
https://xkcd.com/1354/ – immibis
Я думаю, вы ошибаетесь здесь. Многие из этих проблем могут возникнуть в результате плохого дизайна, не говоря уже о хакерах; Java просто обеспечивает изоляционный слой. Позвольте мне проиллюстрировать: у вас достаточно денег, чтобы заплатить за 1 пункт, и вы просите 10, которые предоставляются по запросу. Вы ожидаете заплатить за остальных 9, верно? C заставляет вас закодировать это самостоятельно, тогда как JVM просто убивает ваше приложение из-за неперехваченного исключения. Кроме того: тот факт, что Heartbleed является ошибкой в широко развернутой криптографической библиотеке, является единственной причиной, по которой это было так много, но это было связано с плохим дизайном, а не с C. –