В socat (http://www.dest-unreach.org/socat/), расширенном варианте утилиты netcat, выявлена проблема безопасности (http://www.dest-unreach.org/socat/contrib/socat-secadv7.html), ставящая под сомнение надёжность устанавливаемых защищённых соединений. В задействованной в socat реализации протокола Диффи—Хеллмана (https://ru.wikipedia.org/wiki/%D0%9F%D1%... (Diffie-Hellman) в качестве параметров инициализации были заданы значения неизвестного происхождения, не относящиеся к простым числам (https://ru.wikipedia.org/wiki/%D0%9F%D1%....
Важным условием надёжного обмена ключами при помощи алгоритма Диффи—Хеллмана является применение простых чисел, т.е. чисел которые делятся только на себя и на единицу, в противном случае эффективность алгоритма теряется. Некорректные значения инициализации могли быть подобраны умышленно для предоставления скрытой возможности восстановления секретного ключа, используемого для шифрования обмена с данными.Параметры инициализации в socat были изменены (http://repo.or.cz/socat.git/commitdiff/281d1bd6515c2f0f8984f... в январе 2015 года на основании патча от стороннего пользователя под именем Zhigang Wang. Предлогом внесения изменений были проблемы с работой в режиме FIPS, требующие наличия 1024-битного набора данных инициализации, в то время как в socat использовалися 512-битные параметры. Не исключается (https://news.ycombinator.com/item?id=11014175), что целью данного изменения была интеграция бэкдора и параметры специально были подобраны для предоставления атакующему возможности расчёта закрытого ключа, используемого для шифрования канала связи.
URL: http://arstechnica.com/security/2016/02/crypto-flaw-was-so-g.../
Новость: http://www.opennet.dev/opennews/art.shtml?num=43807
безруких упырей, хардкодящих параметры инициализации диффихельмана, надо гнать в шею ссаными тряпками
Но других то нет...
"других-то", позорище
ключевое слово "выявлен"
ключевой вопрос: "почему не выявили, когда принимали патч? там всего три правки!"
ключевой вопрос: а мне по чем знать ?
> ключевой вопрос: "почему не выявили, когда принимали патч? там всего три правки!"да, почему _вы_ не вякнули вовремя?
Или кто-то должен был это делать за вас? Так у меня для вас плохая новость: эти люди ничерта не понимают в криптографии (вероятнее всего, как и вы).Они всего лишь научились кое-как использовать стандартные библиотеки для получения работающей (не совсем, иначе патч бы не понадобился) программы, решающей актуальные _им_ задачи.
Сделайте лучше - будут пользоваться вашей.
Читаем между строк:
> Некорректные значения инициализации могли быть подобраны умышленно для предоставления скрытой возможности восстановления секретного ключаНе думайте, что умнее всех или кто-то глупее вас, просто были заинтересованные люди вот именно в такой реализации.
Не приписывайте злому умыслу то, что вполне можно объяснить глупостью.
> Не приписывайте злому умыслу то, что вполне можно объяснить глупостью.Не-е-ет! Злой Умысел именно так и хотел бы, чтобы мы думали!! ><>>>
>> Не приписывайте злому умыслу то, что вполне можно объяснить глупостью.
> Не-е-ет! Злой Умысел именно так и хотел бы, чтобы мы думали!!
> ><>>>
ты навскидку знаешь все 1024 битные простые числа?
Попридержите коней. Не все знают, но большие простые числа для нужд криптографии на самом деле "скорее всего простые" т. е. простые с большой вероятностью.
Выбирается случайное число к которому переменяются тесты простоты
https://en.wikipedia.org/wiki/Fermat_primality_test
https://en.wikipedia.org/wiki/Miller%E2%80%93...
ни один из которых не дает 100%
Детерминированный тест простоты(дающий 100%) для таких чисел может занимать годы.
Вот правительственные требования Digital Signature Standard (DSS):
http://csrc.nist.gov/publications/fips/fips186-3/fips_186-3.pdf
> Попридержите коней. Не все знают, но большие простые числа для нужд криптографии
> на самом деле "скорее всего простые" т. е. простые с большой
> вероятностью.
> Выбирается случайное число к которому переменяются тесты простоты
> https://en.wikipedia.org/wiki/Fermat_primality_test
> https://en.wikipedia.org/wiki/Miller%E2%80%93...
> ни один из которых не дает 100%
> Детерминированный тест простоты(дающий 100%) для таких чисел может занимать годы.
> Вот правительственные требования Digital Signature Standard (DSS):
> http://csrc.nist.gov/publications/fips/fips186-3/fips_186-3.pdfслучайное, у каждого своё, фиг знает простое ли, но проходящее тесты число и захардкоденное это одно и то же?
Это socat, который является расширением netcat,который является расширением telnet. Это не клиент банка.
> Это socat, который является расширением netcat,который является расширением telnet. Это
> не клиент банка.любая хрень, из которой можно сделать клиент банка, обязательно станет им
Для чисел порядка 2^1024 один из лучших на сегодня алгоритмов AKS подтвердит простоту за ~ 840 лет
Распространенный алгоритм Miller-Rabin покажет простоту подобного числа с высокой вероятностью менее чем за 0.3 секунды.
http://maths-people.anu.edu.au/~brent/pd/comp4600_primality.pdf
В итоге, все пользуются числами которые не гарантированно простые и иногда палка таки стреляет.
> за ~ 840 летИ что, неужели никто не пробовал запустить проект по поиску гарантированно простых чисел по аналогии с SETI@home?
Вроде как такой проект уже работает
https://en.wikipedia.org/wiki/Great_Internet_Mersenne_Prime_...
> Вроде как такой проект уже работает
> https://en.wikipedia.org/wiki/Great_Internet_Mersenne_Prime_...Упс. Это не те простые числа.
+ Socat did not work in FIPS mode because 1024 instead of 512 bit DH prime
+ is required. Thanks to Zhigang Wang for reporting and sending a patch.
Gerhard Rieger тут не причем, так ему и поверили. Хорошо хоть не Ivan Petrov выбрал, а то русский след и санкции.
Криптографическое ПО, все же, должны писать люди с соотв. профильным образованием. Или тут сознательная "глупость"?Дык, его еще и поблагодарили:
http://repo.or.cz/socat.git/commitdiff/281d1bd6515c2f0f8984f...
> + Socat did not work in FIPS mode because 1024 instead of 512 bit DH prime+ is required. Thanks to Zhigang Wang for reporting and sending a patch.
Простые числа? Не, не слышал. Главное - длина!
>Thanks to Zhigang Wang for reporting and sending a patch.
> Криптографическое ПО, все же, должны писать люди с соотв. профильным образованием. Или
> тут сознательная "глупость"?Как, например, OpenSSL?
обязателно с лицензиями фсб, фстэк, с должностью в профильном фгуп нии и подпиской о невыезде на 10 лет. Только этой "разработкой" никто в своём уме добровольно пользоваться не будет
>целью данного изменения была интеграция бэкдораа теперь, дорогие наши параноики, на секунду вернёмся в реальность и попытаемся дружно ответить на вопрос: есть ли практический смысл во внедрении бекдора в утилиту, которую не применяют для передачи важных данных? (ну может разве что в качестве каких-то временных костылей, см.ССЗБ)
Внедряют везде где могут (где используется шифрование при передаче данных), потому что работают по плану - сказали вставлять, они и вставляют. Кодер кодит, зарплата идет. Уверен, что в драйвере какого-нибудь инфракрасного порта у mediatek-ов и allwinner-ов можно найти бэкдор, хотя в реальности оно может использоваться разве что в случае глобальной войны какой-нибудь.
>Внедряют везде где могут ... потому что работают
>Уверен, что в ... какого-нибудь ... можно найти ... хотя ...Походу изобрели искусственный интеллект.
Интересно зачем socat велосипедная реализация диффи-хеллмана.
> Интересно зачем socat велосипедная реализация диффи-хеллмана.Интересно, зачем тебе это знать
1. если ты даже не понял о чем тема?
2. если ты настолько туп, что не можешь посмотреть код?Там нет реализации Диффи-Хеллмана.
См. ниже. (сорри, не туда ответил)
> Там нет реализации Диффи-Хеллмана.Тогда нужно править новость:
> В задействованной в socat реализации протокола Диффи—Хеллмана (Diffie-Hellman)
Ну, а реально, зачем в socat? У них с его помощью террористы общаются, устанавливая чат типа консольного talk'а? Или это против кривого ПО, которому лень линковаться с OpenSSL, и они по-старинке делают system("socat ...")?
(Да, я такие варианты встречал.)
Вот вы .... чебурашки.dh_param - массив, он пихается в функцию из OpenSSL - BN_bin2bn()
http://repo.or.cz/socat.git/blob/HEAD:/xio-openssl.c#l948
с ним и линкуется. Всё.Они могли заюзать DH_generate_parameters(), если бы не
"DH_generate_parameters_ex() and DH_generate_parameters() may run for several hours before finding a suitable prime."
А так вот, кушайте - параноидальный netcat.
diff -ur xio-openssl.c xio-openssl.c
--- xio-openssl.c 2016-01-29 13:31:22.000000000 +0300
+++ xio-openssl.c 2016-02-03 18:10:01.409103640 +0300
@@ -1078,8 +1055,9 @@
}
Error("DH_new() failed");
} else {
- dh->p = BN_bin2bn(dh2048_p, sizeof(dh2048_p), NULL);
- dh->g = BN_bin2bn(dh2048_g, sizeof(dh2048_g), NULL);
+
+ DH_generate_parameters(2048, 2, NULL, NULL);
+
if ((dh->p == NULL) || (dh->g == NULL)) {
while (err = ERR_get_error()) {
Warn1("BN_bin2bn(): %s",
А где "dh = "?
> А где "dh = "?Это был только прогрев ГПСЧ :)
Вот именно так и появляются бэкдоры.
> Вот именно так и появляются бэкдоры.Бехдора не случится, там дальше по коду оно отвалится: if ((dh->p == NULL) || (dh->g == NULL))
бага исправиться при первом же запуске.
Если в том "дырявом" массиве заменить последнюю циферку с 0x33 на 0x31, то будет фсе пестато. :)$ cat dhcheck.c
#include <stdio.h>
#include <openssl/dh.h>
#include <openssl/bn.h>#define COUNT 500
static unsigned char dh512_p[] = {
0xDA, 0x58, 0x3C, 0x16, 0xD9, 0x85, 0x22, 0x89, 0xD0, 0xE4, 0xAF, 0x75,
0x6F, 0x4C, 0xCA, 0x92, 0xDD, 0x4B, 0xE5, 0x33, 0xB8, 0x04, 0xFB, 0x0F,
0xED, 0x94, 0xEF, 0x9C, 0x8A, 0x44, 0x03, 0xED, 0x57, 0x46, 0x50, 0xD3,
0x69, 0x99, 0xDB, 0x29, 0xD7, 0x76, 0x27, 0x6B, 0xA2, 0xD3, 0xD4, 0x12,
0xE2, 0x18, 0xF4, 0xDD, 0x1E, 0x08, 0x4C, 0xF6, 0xD8, 0x00, 0x3E, 0x7C,
0x47, 0x74, 0xE8, 0x31, /* было 0x33 */
};int main(void)
{
BIGNUM *x = BN_new();
int ret;x = BN_bin2bn(dh512_p, sizeof(dh512_p), NULL);
ret = BN_is_prime(x, COUNT, NULL, NULL, NULL);if ( 0 == BN_is_prime(x, COUNT, NULL, NULL, NULL))
printf("PRIME\n");BN_free(x);
return 0;
}
$ gcc dhcheck.c -o dhcheck -lcrypto
$ ./dhcheck
PRIME
Где гарантия что эти http://repo.or.cz/socat.git/commitdiff/eab3c89f2dc0df0d96389... простые числа не есть подстановка, почему бы их не генерировать каждый раз заново для пущей надежности?
> Где гарантия что эти простые числа не есть подстановкаЯ проверил, все Простые. :)
Что-то стремают меня афторы... Тот "дырявый" массив почти проходит тест DIEHARD,
тем более заменив последний байт на 0x31 получим простое число.
Не всякий массив инициализации функции Д-Х. пройдёт этот тест.
$ dieharder -a -f dh512_p.bin
#=============================================================================#
# dieharder version 3.31.1 Copyright 2003 Robert G. Brown #
#=============================================================================#
rng_name | filename |rands/second|
mt19937| dh512_p.bin| 1.09e+08 |
#=============================================================================#
test_name |ntup| tsamples |psamples| p-value |Assessment
#=============================================================================#
diehard_birthdays| 0| 100| 100|0.42072133| PASSED
diehard_operm5| 0| 1000000| 100|0.93348294| PASSED
diehard_rank_32x32| 0| 40000| 100|0.50636282| PASSED
diehard_rank_6x8| 0| 100000| 100|0.80087713| PASSED
diehard_bitstream| 0| 2097152| 100|0.49859175| PASSED
diehard_opso| 0| 2097152| 100|0.93701062| PASSED
diehard_oqso| 0| 2097152| 100|0.87681359| PASSED
diehard_dna| 0| 2097152| 100|0.00985068| PASSED
diehard_count_1s_str| 0| 256000| 100|0.38077203| PASSED
diehard_count_1s_byt| 0| 256000| 100|0.91407642| PASSED
diehard_parking_lot| 0| 12000| 100|0.10511838| PASSED
diehard_2dsphere| 2| 8000| 100|0.33787326| PASSED
diehard_3dsphere| 3| 4000| 100|0.42425163| PASSED
diehard_squeeze| 0| 100000| 100|0.28059149| PASSED
diehard_sums| 0| 100| 100|0.36955341| PASSED
diehard_runs| 0| 100000| 100|0.94784934| PASSED
diehard_runs| 0| 100000| 100|0.33670770| PASSED
diehard_craps| 0| 200000| 100|0.60849001| PASSED
diehard_craps| 0| 200000| 100|0.63320886| PASSED
marsaglia_tsang_gcd| 0| 10000000| 100|0.99881612| WEAK
marsaglia_tsang_gcd| 0| 10000000| 100|0.43232497| PASSED
sts_monobit| 1| 100000| 100|0.41627930| PASSED
sts_runs| 2| 100000| 100|0.08081905| PASSED
sts_serial| 1| 100000| 100|0.96523338| PASSED
sts_serial| 2| 100000| 100|0.34329119| PASSED
sts_serial| 3| 100000| 100|0.37405652| PASSED
sts_serial| 3| 100000| 100|0.56055487| PASSED
sts_serial| 4| 100000| 100|0.88555644| PASSED
sts_serial| 4| 100000| 100|0.26999174| PASSED
sts_serial| 5| 100000| 100|0.73409122| PASSED
sts_serial| 5| 100000| 100|0.92671381| PASSED
sts_serial| 6| 100000| 100|0.54116499| PASSED
sts_serial| 6| 100000| 100|0.65940545| PASSED
sts_serial| 7| 100000| 100|0.50445052| PASSED
sts_serial| 7| 100000| 100|0.38462124| PASSED
sts_serial| 8| 100000| 100|0.01883628| PASSED
sts_serial| 8| 100000| 100|0.09364789| PASSED
sts_serial| 9| 100000| 100|0.99527517| WEAK
sts_serial| 9| 100000| 100|0.22567136| PASSED
sts_serial| 10| 100000| 100|0.05094379| PASSED
sts_serial| 10| 100000| 100|0.26638756| PASSED
sts_serial| 11| 100000| 100|0.47682961| PASSED
sts_serial| 11| 100000| 100|0.91337413| PASSED
sts_serial| 12| 100000| 100|0.82301376| PASSED
sts_serial| 12| 100000| 100|0.11521050| PASSED
sts_serial| 13| 100000| 100|0.90080189| PASSED
sts_serial| 13| 100000| 100|0.30985033| PASSED
sts_serial| 14| 100000| 100|0.68632920| PASSED
sts_serial| 14| 100000| 100|0.77450446| PASSED
sts_serial| 15| 100000| 100|0.81536533| PASSED
sts_serial| 15| 100000| 100|0.75874580| PASSED
sts_serial| 16| 100000| 100|0.40690099| PASSED
sts_serial| 16| 100000| 100|0.36588177| PASSED
rgb_bitdist| 1| 100000| 100|0.99772882| WEAK
rgb_bitdist| 2| 100000| 100|0.68519083| PASSED
rgb_bitdist| 3| 100000| 100|0.91757188| PASSED
rgb_bitdist| 4| 100000| 100|0.33553147| PASSED
rgb_bitdist| 5| 100000| 100|0.48476640| PASSED
rgb_bitdist| 6| 100000| 100|0.20666545| PASSED
rgb_bitdist| 7| 100000| 100|0.39420382| PASSED
rgb_bitdist| 8| 100000| 100|0.31937097| PASSED
rgb_bitdist| 9| 100000| 100|0.40535694| PASSED
rgb_bitdist| 10| 100000| 100|0.80029262| PASSED
rgb_bitdist| 11| 100000| 100|0.19391309| PASSED
rgb_bitdist| 12| 100000| 100|0.16227006| PASSED
rgb_minimum_distance| 2| 10000| 1000|0.47121358| PASSED
rgb_minimum_distance| 3| 10000| 1000|0.78475966| PASSED
rgb_minimum_distance| 4| 10000| 1000|0.17124787| PASSED
rgb_minimum_distance| 5| 10000| 1000|0.76049571| PASSED
rgb_permutations| 2| 100000| 100|0.66558817| PASSED
rgb_permutations| 3| 100000| 100|0.72662494| PASSED
rgb_permutations| 4| 100000| 100|0.74333289| PASSED
rgb_permutations| 5| 100000| 100|0.65021961| PASSED
rgb_lagged_sum| 0| 1000000| 100|0.07699108| PASSED
rgb_lagged_sum| 1| 1000000| 100|0.74654101| PASSED
rgb_lagged_sum| 2| 1000000| 100|0.70126089| PASSED
rgb_lagged_sum| 3| 1000000| 100|0.87240328| PASSED
rgb_lagged_sum| 4| 1000000| 100|0.75273112| PASSED
rgb_lagged_sum| 5| 1000000| 100|0.67964357| PASSED
rgb_lagged_sum| 6| 1000000| 100|0.87868452| PASSED
rgb_lagged_sum| 7| 1000000| 100|0.38629717| PASSED
rgb_lagged_sum| 8| 1000000| 100|0.37058623| PASSED
rgb_lagged_sum| 9| 1000000| 100|0.99882936| WEAK
rgb_lagged_sum| 10| 1000000| 100|0.11554017| PASSED
rgb_lagged_sum| 11| 1000000| 100|0.80447206| PASSED
rgb_lagged_sum| 12| 1000000| 100|0.99925357| WEAK
rgb_lagged_sum| 13| 1000000| 100|0.97513694| PASSED
rgb_lagged_sum| 14| 1000000| 100|0.95240043| PASSED
rgb_lagged_sum| 15| 1000000| 100|0.87305217| PASSED
rgb_lagged_sum| 16| 1000000| 100|0.94024240| PASSED
rgb_lagged_sum| 17| 1000000| 100|0.21015337| PASSED
rgb_lagged_sum| 18| 1000000| 100|0.85205559| PASSED
rgb_lagged_sum| 19| 1000000| 100|0.19742625| PASSED
rgb_lagged_sum| 20| 1000000| 100|0.96535824| PASSED
rgb_lagged_sum| 21| 1000000| 100|0.75247014| PASSED
rgb_lagged_sum| 22| 1000000| 100|0.80676954| PASSED
rgb_lagged_sum| 23| 1000000| 100|0.45645192| PASSED
rgb_lagged_sum| 24| 1000000| 100|0.89938885| PASSED
rgb_lagged_sum| 25| 1000000| 100|0.28835945| PASSED
rgb_lagged_sum| 26| 1000000| 100|0.65195125| PASSED
rgb_lagged_sum| 27| 1000000| 100|0.42480256| PASSED
rgb_lagged_sum| 28| 1000000| 100|0.81137147| PASSED
rgb_lagged_sum| 29| 1000000| 100|0.99062570| PASSED
rgb_lagged_sum| 30| 1000000| 100|0.69861615| PASSED
rgb_lagged_sum| 31| 1000000| 100|0.36680859| PASSED
rgb_lagged_sum| 32| 1000000| 100|0.58995001| PASSED
rgb_kstest_test| 0| 10000| 1000|0.66001283| PASSED
dab_bytedistrib| 0| 51200000| 1|0.57505391| PASSED
dab_dct| 256| 50000| 1|0.07271741| PASSED
Preparing to run test 207. ntuple = 0
dab_filltree| 32| 15000000| 1|0.90513293| PASSED
dab_filltree| 32| 15000000| 1|0.99935515| WEAK
Preparing to run test 208. ntuple = 0
dab_filltree2| 0| 5000000| 1|0.74150410| PASSED
dab_filltree2| 1| 5000000| 1|0.87616969| PASSED
Preparing to run test 209. ntuple = 0
dab_monobit2| 12| 65000000| 1|0.16566036| PASSED