The OpenNET Project / Index page

[ новости /+++ | форум | wiki | теги | ]

Уязвимость в библиотеке с основной реализацией алгоритма SHA-3

21.10.2022 08:39

В реализации криптографической хэш-функции SHA-3 (Keccak), предлагаемой в пакете XKCP (eXtended Keccak Code Package), выявлена уязвимость (CVE-2022-37454), которая может привести к переполнению буфера в процессе обработки определённо оформленных данных. Проблема вызвана ошибкой в коде конкретной реализации SHA-3, а не уязвимостью в самом алгоритме. Пакет XKCP преподносится как официальная реализация SHA-3, развивается при участии команды разработчиков Keccak и используется в качестве основы в функциях для работы с SHA-3 в различных языках программирования (например, код XKCP используется в Python-модуле hashlib, Ruby-пакете digest-sha3 и PHP-функциях hash_*).

По заявлению исследователя, выявившего проблему, ему удалось использовать уязвимость для нарушения криптографических свойств хэш-функции и нахождения первого и второго прообраза, а также определения коллизий. Кроме того, заявлено о создании прототипа эксплоита, позволяющего добиться выполнения кода при вычислении хэша специально оформленного файла. Потенциально уязвимость также может быть использована для атак на алгоритмы проверки цифровых подписей, использующих SHA-3 (например, Ed448). Подробности методов проведения атак планируется опубликовать позднее, после повсеместного устранения уязвимости.

Насколько уязвимость затрагивает существующие приложения на практике пока не ясно, так как для проявления проблемы в коде должно применяться цикличное вычисление хэша блоками и один из обрабатываемых блоков должен иметь размер около 4 ГБ (не менее 2^32 - 200 байт). При обработке входных данных разом (без последовательного вычисления хэша частями) проблема не проявляется. В качестве наиболее простого метода защиты предлагается ограничить максимальный размер данных, участвующих в одной итерации вычисления хэша.

Уязвимость вызвана ошибкой при блочной обработке входных данных. Из-за некорректного сравнения значений с типом "int" определяется неверный размер ожидающих обработки данных, что приводит к записи хвоста за пределы выделенного буфера. В частности, при сравнении использовалось выражение "partialBlock + instance->byteIOIndex", которое при больших значениях составных частей приводило к целочисленному переполнению. Кроме того, в коде присутствовало неверное приведение типов "(unsigned int)(dataByteLen - i)", приводившее к переполнению на системах с 64-разрядным типом size_t.

Пример кода, приводящего к переполнению:


   import hashlib
   h = hashlib.sha3_224()
   m1 = b"\x00" * 1;
   m2 = b"\x00" * 4294967295;
   h.update(m1)
   h.update(m2)
   print(h.hexdigest())


  1. Главная ссылка к новости (https://mouha.be/sha-3-buffer-...)
  2. OpenNews: Предложен метод определения коллизий в SHA-1, пригодный для атаки на PGP
  3. OpenNews: Google продемонстрировал первую успешную атаку на алгоритм хеширования SHA-1
  4. OpenNews: Представлена хеш-функция BLAKE2, претендующая на роль высокопроизводительной замены MD5 и SHA1
  5. OpenNews: SHA-3 присвоен статус федерального стандарта США
  6. OpenNews: Выбран финальный алгоритм для SHA-3
Лицензия: CC-BY
Тип: Проблемы безопасности
Короткая ссылка: https://opennet.ru/57953-sha3
Ключевые слова: sha3, hash, keccak
При перепечатке указание ссылки на opennet.ru обязательно


Обсуждение (77) Ajax | 1 уровень | Линейный | +/- | Раскрыть всё | RSS
  • 1.1, Аноним (1), 09:01, 21/10/2022 Скрыто модератором [﹢﹢﹢] [ · · · ]
  • +7 +/
     
     
  • 2.3, Аноним (-), 09:03, 21/10/2022 Скрыто модератором
  • +1 +/
     
     
  • 3.7, Rev (?), 09:08, 21/10/2022 Скрыто модератором
  • +2 +/
     
     
  • 4.10, Аноним (10), 09:17, 21/10/2022 Скрыто модератором
  • –3 +/
     
     
  • 5.26, Аноним (26), 09:45, 21/10/2022 Скрыто модератором
  • –2 +/
     
     
  • 6.29, Аноним (10), 09:50, 21/10/2022 Скрыто модератором
  • +1 +/
     
     
  • 7.30, Аноним (30), 09:55, 21/10/2022 Скрыто модератором
  • –2 +/
     
     
  • 8.33, Аноним (10), 09:59, 21/10/2022 Скрыто модератором
  • +/
     
     
  • 9.37, Аноним (37), 10:04, 21/10/2022 Скрыто модератором
  • –2 +/
     
  • 5.35, Аноним (35), 10:03, 21/10/2022 Скрыто модератором
  • –1 +/
     
  • 4.27, Анонн (?), 09:45, 21/10/2022 Скрыто модератором
  • +/
     
     
  • 5.32, Аноним (10), 09:56, 21/10/2022 Скрыто модератором
  • +/
     
     
  • 6.39, Анонн (?), 10:15, 21/10/2022 Скрыто модератором
  • +1 +/
     

     ....ответы скрыты модератором (12)

  • 1.40, Джон Макагонов (?), 10:57, 21/10/2022 [ответить] [﹢﹢﹢] [ · · · ]  
  • –14 +/
    Еще один жирнющий намек на раст, рано или поздно сишники перейдут на раст - у них просто на останется выбора,  это дело времени.
     
     
  • 2.43, Аноним (43), 11:16, 21/10/2022 [^] [^^] [^^^] [ответить]  
  • +/
    С Фортрана?
     
  • 2.66, Аноним (66), 12:33, 21/10/2022 [^] [^^] [^^^] [ответить]  
  • +5 +/
    Тут только намек на то что открытый код спасает от проблем. А повышать надо квалификацию и тестирование.  
     
  • 2.68, Аноним (68), 12:54, 21/10/2022 [^] [^^] [^^^] [ответить]  
  • +2 +/
    Могут перейти на Hare.
     
  • 2.79, Брат Анон (ok), 13:57, 21/10/2022 [^] [^^] [^^^] [ответить]  
  • –1 +/
    golang и oberon это умеют точно так же.
    Только с человеческим синтаксисом и без всякого пеара.
     
     
  • 3.83, Аноним (-), 14:02, 21/10/2022 [^] [^^] [^^^] [ответить]  
  • +/
    У го жирный рантайм(((

    А "человеческий синтаксис" это явно не про оберон

     
     
  • 4.87, Аноним (87), 14:16, 21/10/2022 [^] [^^] [^^^] [ответить]  
  • +1 +/
    У раст жирный рантайм(((
     
     
  • 5.122, Аноним (122), 22:11, 21/10/2022 [^] [^^] [^^^] [ответить]  
  • –2 +/
    Растоманы надоели все время врать что у них нет рантайма. Все опеннет эксперты знают что borrow checker это тот же сборщик мусора, а llvm значит интерпретатор.
    Раст такой же интерпретируемый язычек как и java
     
  • 4.89, Аноним (89), 15:01, 21/10/2022 [^] [^^] [^^^] [ответить]  
  • +2 +/
    Раст еще жирнее. Сколько там хелло ворлд весит дебажный?
     
  • 4.106, Neon (??), 17:19, 21/10/2022 [^] [^^] [^^^] [ответить]  
  • +3 +/
    "человеческий синтаксис"  - уж точно не про Rust
     
     
  • 5.110, freecoder (ok), 18:19, 21/10/2022 [^] [^^] [^^^] [ответить]  
  • –2 +/
    У Rust хороший синтаксис. Особо не лучше и не хуже, чем в других языках. Новичкам только непривычен.
     
     
  • 6.111, Аноним (-), 18:44, 21/10/2022 [^] [^^] [^^^] [ответить]  
  • +2 +/
    > У Rust хороший синтаксис.

    Он хороший, правда меняется от версии к версии, нет никаких стандартов но в общем он хороший

     
     
  • 7.121, Аноним (122), 22:07, 21/10/2022 [^] [^^] [^^^] [ответить]  
  • +2 +/
    Растоманы надоели менять свой синтаксис в каждой версия, пока пишу хелло ворлд, он уже перестает работать
     
     
  • 8.139, freecoder (ok), 10:48, 26/10/2022 [^] [^^] [^^^] [ответить]  
  • +/
    Приведите пример синтаксиса, который перестал работать между изменениями версий ... текст свёрнут, показать
     
  • 6.113, Вы забыли заполнить поле Name (?), 19:40, 21/10/2022 [^] [^^] [^^^] [ответить]  
  • +3 +/
    > У Rust хороший синтаксис. Новичкам только непривычен.

    Китайский просто язык. Новичкам только непривычен.

     
     
  • 7.123, Аноним (122), 22:20, 21/10/2022 [^] [^^] [^^^] [ответить]  
  • –2 +/
    То что эксперты опеннет не могут освоить си подобный синтаксис раста, говорит не о том что экспертам нужно заняться чем-то далёким от программирования, а о том что Раст это сложно язык.
    Любой опеннет эксперт это понимает и до физической работы, да и вообще любой работы не опустится.
     
  • 2.96, Аноним (96), 15:48, 21/10/2022 [^] [^^] [^^^] [ответить]  
  • +/
    > Еще один жирнющий намек на раст

    Ну и каким образом раст поможет в решении этой проблемы? Его компилятор что, знает значения переменных во время выполнения?

     
     
  • 3.103, Igraine (ok), 17:01, 21/10/2022 [^] [^^] [^^^] [ответить]  
  • –3 +/
    https://doc.rust-lang.org/book/ch03-02-data-types.html#integer-overflow

    Проверкой в debug режиме

     
  • 2.129, OpenEcho (?), 06:18, 22/10/2022 [^] [^^] [^^^] [ответить]  
  • +/
    Есть такая хорошая пословица: "Осел останется Ослом, хоть ты осыпь его звездами."
    Так и здесь, раст не панацея, это просто инструмент и если он в руках дебила, то разницы между молотком и микроскопом нет
     

  • 1.46, Аноним (46), 11:20, 21/10/2022 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    у кого 2 в 32й равно 200 байт????
     
     
  • 2.71, Аноним (-), 13:25, 21/10/2022 [^] [^^] [^^^] [ответить]  
  • +2 +/
    у кого? где ты такое вычитал?
     

  • 1.48, Аноним (48), 11:26, 21/10/2022 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Теперь люди будут шарахаться от предложений об обязательной проверке хеша после скачивания...

    Мне кажется, что компилятор должен был громко кричать о подобных переполнениях и его либо не слушали, либо заткнули ему рот.

     
     
  • 2.50, Без аргументов (?), 11:29, 21/10/2022 [^] [^^] [^^^] [ответить]  
  • +/
    В Го даже int8 к int32 присвоить без внимания программиста нельзя
     
  • 2.51, Без аргументов (?), 11:30, 21/10/2022 [^] [^^] [^^^] [ответить]  
  • +/
    В современных Сях тоже полно опций предупреждений и ошибок. Но скажу, почему выключают: сразу все импорты начнут высыпать, а не собственный код.
     
  • 2.72, Аноним (96), 13:27, 21/10/2022 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Но компилятор же не может знать значений переменных в рантайме.
     
     
  • 3.73, Аноним (48), 13:29, 21/10/2022 [^] [^^] [^^^] [ответить]  
  • +/
    Не может, но всегда предполагает самое худшее.
     
     
  • 4.124, Аноним (122), 22:24, 21/10/2022 [^] [^^] [^^^] [ответить]  
  • +/
    Растоманы не могут понять даже таких очевидных вещей, что компилятор по настоящему безопасного языка должен предполагать самое худшее.
    Любой опеннет эксперт это подтвердит, Раст на самом деле опасный язык
     

  • 1.58, Аноним (58), 12:07, 21/10/2022 [ответить] [﹢﹢﹢] [ · · · ]  
  • –1 +/
    Всё-таки сработала тысяча глаз
     
     
  • 2.69, Анонн (?), 12:57, 21/10/2022 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Не, это явно не тот случай.
    "Тысяча глаз" была бы если бы это нашел рандомный анон с опеннета.

    А этот чувак -- исследователь-криптограф с профильным образованием, разработчкик Chaskey, с публикациями (https://mouha.be/publications/), работающий в Computer Security Division NIST.
    Это его работа и он сделал ее хорошо)))
    Уверен что он знал (ну, или как минимум предполагал) и где искать и что искать.

     
     
  • 3.77, Michael Shigorin (ok), 13:52, 21/10/2022 [^] [^^] [^^^] [ответить]  
  • +/
    Вы сами заметите ошибку в логике своего _опубликованного_ комментария или понадобится ещё сколько-то прочитавших и ещё один не поленившийся ответить? :)
     
  • 3.78, Аноним (-), 13:53, 21/10/2022 [^] [^^] [^^^] [ответить]  
  • +4 +/
    > рандомный анон с опеннета.

    ... не умеет в программирование. ;)

     
     
  • 4.127, 1111 (??), 02:50, 22/10/2022 [^] [^^] [^^^] [ответить]  
  • +/
    >> рандомный анон с опеннета.

    даже если найдётся тот кто умеет - его сразу деанонимизируют и опять скажут что но не анонимый и не рандомный. Глядишь до местных мыслителей через тысячу итерация дойдёт что конкретное дело не может сделать кто то рандомный, а только кто то  конкретный с именем, даже ели он с опеннета...

     

  • 1.59, Аноним (59), 12:09, 21/10/2022 [ответить] [﹢﹢﹢] [ · · · ]  
  • +3 +/
    Объясните как безопасный раст защитит от таких переполнений?
    Допустим библиотека написана на безопасном расте. В параметры передаются указатели на буфер с исходными данными и на буфер для сохранения результата и соответственно их размеры. Если в алгоритме ошибка то любой раст спокойно выйдет за пределы буфера и ни кто про это не узнает.
     
     
  • 2.61, Без аргументов (?), 12:15, 21/10/2022 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Не знаю как в Расте, но даже в Го меня бесит, что стандартные всякие циклы, len и возвращаемые количество знаковых типов, т.е. если у себя использовать беззнак, то только приведет к такой же проблеме
     
     
  • 3.80, Брат Анон (ok), 13:59, 21/10/2022 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Не приведёт. Го требует явное приведение типов, иначе откажется такой код собирать.
    И использовать счётчики циклов в Го -- это ни разу не го-вей.
     
     
  • 4.108, Без аргументов (?), 18:12, 21/10/2022 [^] [^^] [^^^] [ответить]  
  • –1 +/
    это как в Го без счетчиков? даже в range он есть, но когда мне надо перелопатить 200к строк БД на стороне Го, наполняя слайс структур, я предпочитаю работать по ссылке, а не копии.
     
  • 4.109, Без аргументов (?), 18:14, 21/10/2022 [^] [^^] [^^^] [ответить]  
  • +/
    я имею в виду нет никакой пользы, если я напишу
    a := uint64_t(123)
    if a < uint64(len(slice))
    или
    if int(a) < len(slice)
     
  • 2.62, Анонн (?), 12:17, 21/10/2022 [^] [^^] [^^^] [ответить]  
  • +/
    В дебаге переполнение вызвало бы панику и намекнуло бы программисту что что-то пошло не так (причем жирно так намекнуло, со стектрейсом аж до проблемы).

    Допустим этого не случилось и оно пошло в прод. В проде переполнение бы произошло, но при попытке "записи хвоста за пределы выделенного буфера" произошла бы другая паника. А дальше зависит от написаного кода. Если кастомной обработки паники нет - приложение бы упало, но не было бы RCE. Если кастомная обработка есть - то зависит от ее логики.

     
  • 2.65, Аноним (66), 12:32, 21/10/2022 [^] [^^] [^^^] [ответить]  
  • +3 +/
    Никак раст в этом месте будет применять unsafe.
     
     
  • 3.67, Анонн (?), 12:35, 21/10/2022 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Фигли? Вот в скрытой ветке выше есть две ссылки на сорцы и там никакого unsafe там нет.
    Просто потому что он там не нужен.
     
  • 3.70, Аноним (-), 13:08, 21/10/2022 [^] [^^] [^^^] [ответить]  
  • +/
    Дааааа, без анскйфа никуда, а то ж тормозить будет)))
    https://imgflip.com/i/6xqnov
     
     
  • 4.75, Аноним (87), 13:34, 21/10/2022 [^] [^^] [^^^] [ответить]  
  • +/
    Ну дополнительные проверки не могут существовать без дополнительных накладных расходов.
     
     
  • 5.82, Брат Анон (ok), 14:01, 21/10/2022 [^] [^^] [^^^] [ответить]  
  • –1 +/
    > Ну дополнительные проверки не могут существовать без дополнительных накладных расходов.

    Дополнительные проверки -- это результат кривого железа. И это не дополнительные проверки. Это нормальные проверки.

     
     
  • 6.88, Аноним (87), 14:17, 21/10/2022 [^] [^^] [^^^] [ответить]  
  • +2 +/
    Что ты несёшь?
     
     
  • 7.97, fhsdfku (?), 16:03, 21/10/2022 [^] [^^] [^^^] [ответить]  
  • +/
    это походу новая повесточка от хозяев растоманов: покупайте наше сааамое безопасное железо!
     
     
  • 8.99, Аноним (99), 16:09, 21/10/2022 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Да они походу пытаются толкать RISC-V как новое безопасное железо ... текст свёрнут, показать
     
     
  • 9.102, Анонн (?), 16:49, 21/10/2022 [^] [^^] [^^^] [ответить]  
  • +1 +/
    А с чего бы RISC-V стал безопасным У него другие плюсы - можно делать процы и н... текст свёрнут, показать
     
  • 5.93, Аноним (58), 15:35, 21/10/2022 [^] [^^] [^^^] [ответить]  
  • +/
    Любые проверки это дополнительные расходы, давайте без них. Ну кому нужен этот SHA?
     
     
  • 6.112, Аноним (112), 19:19, 21/10/2022 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Если они происходят не в компайл тайме, как борроучекер.
     

  • 1.64, Ilya Indigo (ok), 12:32, 21/10/2022 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Я так понимаю SHA-3 != SHA3-256, и SHA3-256 это не затрагивает, тем боле без 4 ГБ блока?
     
     
  • 2.86, Аноним (86), 14:14, 21/10/2022 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Проверь и доложи.
     
  • 2.104, Аноним (104), 17:14, 21/10/2022 [^] [^^] [^^^] [ответить]  
  • +/
    SHA-3 - семейство функций, которое включает, в том числе, функцию SHA3-256.
     

  • 1.84, Аноним (10), 14:07, 21/10/2022 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    > Насколько уязвимость затрагивает существующие приложения на практике пока не ясно

    Т.е. в реальном мире "уязвимость" опять невозможно проэксплуатировать?

     
     
  • 2.85, Анонн (?), 14:12, 21/10/2022 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Автор пишет что да https://mouha.be/sha-3-buffer-overflow/
    "Moreover, I’ve also shown how a specially constructed file can result in arbitrary code execution, and the vulnerability can also impact signature verification algorithms such as Ed448 that require the use of SHA-3"
    Только публиковать будет позже.

    А еще из забавного, чего нет в новости, уязвимый код был релизнут "in January 2011".
    Тыщщи глаз просто засмотрелись куда-то)))

     
     
  • 3.98, fhsdfku (?), 16:08, 21/10/2022 [^] [^^] [^^^] [ответить]  
  • +3 +/
    > Тыщщи глаз просто засмотрелись куда-то)))

    хоть через столько лет, но пример преимущества открытого кода: ошибку-таки нашли.

    а сколько там во всяких вендах да ораклах с эпплами - можно только гадать..

    учитывая, что пишут те же девелоперс с такими же ошибками, а вот иллюзия защищённости из-за огороженности есть.
    плюс, всякие соглашения о неразглашении и прочие лицензии - и серьёзная ошибка может эксплуатироваться вечность.

     
     
  • 4.100, Аноним (99), 16:10, 21/10/2022 [^] [^^] [^^^] [ответить]  
  • +2 +/
    Я тебе больше скажу можно туда специально добавлять «ошибки», а потом их за деньги продавать тому кто больше заплатит.
     
  • 4.101, Аноним (101), 16:35, 21/10/2022 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Вот ты так раз - и считаешь что там хуже. Это ж так удобно.
    А то, что оракл мог просто нанять этого (или любого другого) чела для поиска уязвимостей в своих продуктах... это же нереально, да)) И ему дадут доступ к закрытым сорцам, и он подпишет НДА. А мы ничего не узнаем. Плюс и ябло, и майки платят за уязвимости, хотя код закрыт.

    Почему иллюзия? Что легче исследовать - бинарник или сорцы?
    Посидеть-почитать код вечерком или пыхтеть в IDAPro? Первое может делать любой первокурсник, а для второго нужны хоть какие-то компетенции.

     
     
  • 5.116, Вы забыли заполнить поле Name (?), 20:03, 21/10/2022 [^] [^^] [^^^] [ответить]  
  • +/
    > И ему дадут доступ к закрытым сорцам, и он подпишет НДА. А мы ничего не узнаем.

    Это ж так удобно (с).

    "Корпорации заботятся о тебе" - не забывай это повторять перед сном.

     
     
  • 6.118, Аноним (101), 21:43, 21/10/2022 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Корпорации заботятся о себе и только о себе.
    Именно поэтому гугел выплачивает по 40к за обход песочницы в хромом. Просто не хочет терять аудиторию.
    Или эпл за джейлбрейк. Тоже чтобы не терять деньги.
    И за это они готовы платить. А не ждать 10 лет пока кто-то решит покопаться в их коде.
     
     
  • 7.138, Вы забыли заполнить поле Name (?), 23:52, 25/10/2022 [^] [^^] [^^^] [ответить]  
  • +/
    Код хромиума открыт, алё. Кто и как будет копаться в закрытом коде?

    Кстати, все крупные компании используют наработки опенсурс проектов и платят за найденные уязвимости в них.

     

  • 1.105, Аноним (104), 17:17, 21/10/2022 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    А в OpenSSL реализации SHA-3 этой уязвимости нет! :)
     
  • 1.107, Аноним (107), 17:24, 21/10/2022 [ответить] [﹢﹢﹢] [ · · · ]  
  • +2 +/
    Дашь сишнику массив, так он и за границу выйдет, и произвольный код выполнит. Надо полагать, эталонную реализацию SHA3 тоже ненастоящие сишники прогали. Настоящие-то существуют хоть где-то за пределами фантазий опеннетчиков?
     
     
  • 2.125, Аноним (125), 22:45, 21/10/2022 [^] [^^] [^^^] [ответить]  
  • +1 +/
    > Надо полагать, эталонную реализацию SHA3 тоже ненастоящие сишники прогали.

    А вы полагаете настоящие? Не в обиду математикам, но математики редко бывают хорошими программистами.

     
     
  • 3.131, Аноним (10), 07:43, 22/10/2022 [^] [^^] [^^^] [ответить]  
  • +1 +/
    > математики редко бывают хорошими программистами

    зато чаще других организуют "институты математики и информационных технологий".

     

  • 1.132, CVE (?), 10:37, 22/10/2022 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Молотком по пальцу себе стукнул. Плохой молоток, нужен безопасный молоток, который будет сидеть рядом со мной и рассказывать как правильно гвозди забивать, потом проверит правильно ли я его держу, а при слабом или неровном замахе будет стукать меня током, чтобы я не ударил мимо гвоздя или по пальцу. Вон шурин мой дом построил, руки все в шрамах, а я вот подготовлю свой молоток, принесу его сообществу строителей, покажу как можно все дома перестроить с нуля, используя безопасный молоток.
     

     Добавить комментарий
    Имя:
    E-Mail:
    Текст:



    Спонсоры:
    PostgresPro
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2023 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру