безопасность — время атаки в переполнении стека

зЬгстр — Что означает «Сравнение двоичных безопасных строк»? Это сравнение безопасно для времени атаки?

Если нет, как я могу сравнить две строки для предотвращения атаки по времени? Сравнение хешей строк достаточно? Или я должен использовать некоторую библиотеку (или собственный код), который дает постоянное время для сравнения?

Вот пишет, что время атаки может быть использовано в сети. Но может ли этот тип атаки существовать в реальном мире? Или эта атака может быть использована только для небольшого типа злоумышленника (например, правительства), поэтому эта защита через Интернет является избыточной?

1

Решение

«бинарный сейф» означает, что любые байты можно безопасно сравнивать с strcmp, а не только действительные символы в некотором наборе символов. Быстрый тест подтверждает, что strcmp не является безопасным от временных атак:

$nchars = 1000;
$s1 = str_repeat('a', $nchars + 1);
$s2 = str_repeat('a', $nchars) . 'b';
$s3 = 'b' . str_repeat('a', $nchars);

$times = 100000;

$start = microtime(true);
for ($i = 0; $i < $times; $i++) {
strcmp($s1, $s2);
}
$timeForSameAtStart = microtime(true) - $start;

$start = microtime(true);
for ($i = 0; $i < $times; $i++) {
strcmp($s1, $s3);
}
$timeForSameAtEnd = microtime(true) - $start;

printf("'b' at the end: %.4f\n'b' at the front: %.4f\n", $timeForSameAtStart, $timeForSameAtEnd);

Для меня это печатает что-то вроде 'b' at the end: 0.0634 'b' at the front: 0.0287,

Многие другие строковые функции в PHP, вероятно, страдают от подобных проблем. Обойти это сложно, особенно в PHP, где вы на самом деле не знаете, что на физическом уровне выполняет множество функций.

Одна из возможных тактик — просто вставить случайное время ожидания в ваш код, прежде чем вернуть ответ вызывающему / потенциальному злоумышленнику. Еще лучше измерить, сколько времени потребовалось для проверки входных данных (например, с microtime), а затем подождите случайное время минус это количество времени. Это не на 100% безопасно, но делает атаку системы НАМНОГО сложнее, потому что, как минимум, злоумышленнику придется многократно проверять каждый вход, чтобы отфильтровать случайность.

0

Другие решения

Проблема с strcmp в том, что это зависит от реализации. Если он двоично сравнивает каждый байт строк до тех пор, пока не достигнет разницы или конца какой-либо из строк, то он уязвим для временной атаки.

Теперь как насчет хеширования?

Я нашел этот секретный вопрос и считаю, что у него есть правильный ответ для вас:
https://security.stackexchange.com/a/46215

0

Сроки атаки это миф.

Я объясняю.

Время, которое требуется для проверки текста между одним аналогом и другим, составляет около доли секунды, скажем +/- 0,1 секунды (преувеличено!).

Однако время, которое требуется злоумышленнику, чтобы измерить это время:

задержка сети + 0,1 секунды + задержка системы (возможно, она занята выполнением какой-либо другой задачи) + другие задержки.

Так что нет, это невозможно, даже для локальной системы (с нулевым лагом) результат интервала времени всегда неясен.

-1
По вопросам рекламы [email protected]