зЬгстр — Что означает «Сравнение двоичных безопасных строк»? Это сравнение безопасно для времени атаки?
Если нет, как я могу сравнить две строки для предотвращения атаки по времени? Сравнение хешей строк достаточно? Или я должен использовать некоторую библиотеку (или собственный код), который дает постоянное время для сравнения?
Вот пишет, что время атаки может быть использовано в сети. Но может ли этот тип атаки существовать в реальном мире? Или эта атака может быть использована только для небольшого типа злоумышленника (например, правительства), поэтому эта защита через Интернет является избыточной?
«бинарный сейф» означает, что любые байты можно безопасно сравнивать с 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% безопасно, но делает атаку системы НАМНОГО сложнее, потому что, как минимум, злоумышленнику придется многократно проверять каждый вход, чтобы отфильтровать случайность.
Проблема с strcmp в том, что это зависит от реализации. Если он двоично сравнивает каждый байт строк до тех пор, пока не достигнет разницы или конца какой-либо из строк, то он уязвим для временной атаки.
Теперь как насчет хеширования?
Я нашел этот секретный вопрос и считаю, что у него есть правильный ответ для вас:
https://security.stackexchange.com/a/46215
Сроки атаки это миф.
Я объясняю.
Время, которое требуется для проверки текста между одним аналогом и другим, составляет около доли секунды, скажем +/- 0,1 секунды (преувеличено!).
Однако время, которое требуется злоумышленнику, чтобы измерить это время:
задержка сети + 0,1 секунды + задержка системы (возможно, она занята выполнением какой-либо другой задачи) + другие задержки.
Так что нет, это невозможно, даже для локальной системы (с нулевым лагом) результат интервала времени всегда неясен.