|
Программы с потенциально опасными последствиями
Программой с потенциально опасными последствиями назовем программу или часть программы, которая способна выполнить одно из следующих действий:
- скрыть признаки своего присутствия в программной среде ПЭВМ;
- самодублироваться, ассоциировать себя с другими программами и/или переносить свои фрагменты в какие-либо области оперативной или внешней памяти, не принадлежащие программе;
- изменять код программ в оперативной или внешней памяти;
- сохранять фрагменты информации из оперативной памяти в некоторых областях внешней памяти (локальных или удаленных);
- искажать произвольным образом, блокировать и/или подменять выводимый во внешнюю память или канал связи массив информации, образовавшийся в результате работы прикладных программ, или уже находящиеся во внешней памяти массивы данных.
Программы с потенциально опасными последствиями можно условно подразделить на:
- классические программы-"вирусы";
- программы типа "программный червь" или "троянский конь" и фрагменты программ типа "логический люк";
- программы типа "логическая бомба";
- программные закладки - обобщенный класс программ с потенциально опасными последствиями.
Кроме того, такие программы можно классифицировать по методу и месту их внедрения и применения (то есть по "cпособу доставки" в систему):
- закладки, связанные с программно-аппаратной средой (BIOS);
- закладки, связанные с программами первичной загрузки;
- закладки, связанные с драйвером DOS, командным интерпретатором, сетевыми драйверами, то есть с загрузкой и работой операционной среды;
- закладки, связанные с прикладным программным обеспечением общего назначения (встроенные в клавиатурные и экранные драйверы, программы тестирования ПЭВМ, утилиты, файловые оболочки);
- исполняемые модули, содержащие только код закладки (как правило, внедряемые в пакетные файлы типа BAT);
- модули-имитаторы, совпадающие по внешнему виду с легальными программами, требующими ввода конфеденциальной информации;
- закладки, маскируемые под программные средства оптимизационного назначения (архиваторы, ускорители и т.д.);
- закладки, маскируемые под программные средства игрового и развлекательного назначения (как правило, используются для первичного внедрения других закладок; условное название - "исследователь").
Вирус
Первые исследования саморазмножающихся искусственных конструкций проводились в середине прошлого столетия: в работах фон Неймана, Винера и др. дано определение и проведен математический анализ конечных автоматов, в том числе самовоспроизводящихся. Термин "компьютерный вирус" появился позднее - официально считается, что его впервые употребил сотрудник Лехайского университета (США) Фред Коэн в 1984 году на 7-й конференции по безопасности информации, проходившей в США.
Компьютерным вирусом называется программа, которая может создавать свои копии (не обязательно совпадающие с оригиналом) и внедрять их в файлы, системные области компьютера, сети и так далее. При этом копии сохраняют способность дальнейшего распространения.
Вирусы можно разделить на классы по следующим признакам:
- по среде обитания вируса;
- по способу заражения среды обитания;
- по деструктивным возможностям.
По среде обитания различают вирусы сетевые, файловые, загрузочные и специальные. Сетевые вирусы распространяются по компьютерной сети, файловые внедряются в выполняемые файлы, загрузочные в загрузочный сектор диска(Boot) или сектор, содержащий системный загрузчик винчестера(Master Boot Record). Специальные ориентированы на конкретные особенности ПО, например вирус, заражающий документы редактора Word. Существуют сочетания - например, файлово-загрузочные вирусы, заражающие и файлы и загрузочные сектора дисков. Кроме того, по сети могут распространятся вирусы любых типов.
Способы заражения делятся на резидентный и нерезидентный. Резидентный вирус при инфицировании компьютера оставляет в оперативной памяти свою резидентную часть, которая затем перехватывает обращение операционной системы к объектам заражения и внедряется в них. Резидентные вирусы находятся в памяти и остаются активными вплоть до выключения или перезагрузки компьютера. Нерезидентные вирусы не заражают память компьютера и являются активными ограниченное время. Некоторые вирусы оставляют в оперативной памяти небольшие резидентные программы, которые не распространяют вирус. Такие вирусы считаются нерезидентными.
По деструктивным возможностям вирусы можно разделить на:
- безвредные, никак не влияющие на работу компьютера (кроме уменьшения свободной памяти на диске в результате своего распространения);
- неопасные, влияние которых ограничивается уменьшением свободной памяти на диске и графическими, звуковыми и прочими эффектами;
- опасные вирусы, которые могут привести к серьезным сбоям в работе компьютера;
- очень опасные вирусы, которые могут привести к потере программ, уничтожить данные, способствовать ускоренному износу или повреждению частей механизмов(например, головок винчестеров).
Люк
Люком называется не описанная в документации на программный продукт возможность работы с этим программным продуктом. Сущность использования люков состоит в том, что при выполнении пользователем некоторых не описанных в документации действий он получает доступ к возможностям и данным, которые в обычных условиях для него закрыты (в частности - выход в привилегированный режим).
Люки чаще всего являются результатом забывчивости разработчиков. В процессе разработки программы разработчики часто создают временные механизмы, облегчающие ведение отладки за счет прямого доступа к отлаживаемым частям продукта. По окончанию отладки большинство люков убирается из программы; но люди есть люди - зачастую они забывают о существовании каких-то мелких "лючков".
Одним из наиболее показательных примеров использования "забытых" люков является, пожалуй, широко известный в компьютерном мире инцидент с вирусом Морриса. Одной из причин, обусловивших возможность распространения этого вируса, была ошибка разработчика программы электронной почты, входящей в состав одной из версий операционной системы UNIX, приведшая к появлению малозаметного лючка. Для вас, наверное, будет небесполезно знать, что американские специалисты оценивают ущерб, нанесенный в результате этого инцидента, более чем в 100 миллионов долларов.
Люки могут образовываться также в результате часто практикуемой технологии разработки программных продуктов "сверху вниз". При этом программист приступает сразу к написанию сразу управляющей программы, заменяя предполагаемые в будущем подпрограммы так называемыми "заглушками". В теории моментом завершения разработки конечной программы по такой технологии можно считать момент замены последней заглушки реальной подпрограммой.
В действительности дело обстоит несколько сложнее. Вся беда в том, что авторы часто оставляют заглушки в конечном программном продукте, передаваемом в эксплуатацию. Делают это порой неумышленно: например, на ранних стадиях разработки предполагалось наличие в конечном программном продукте некоторой подпрограммы, однако в процессе разработки выяснилось, что эта подпрограмма в силу каких-либо причин не нужна. Но заглушка-то осталась! Удалить заглушку, не заменяя ее подпрограммой, бывает весьма сложно. Это может спровоцировать программиста оставить заглушку "до лучших времен".
Возможен вариант, когда заглушки оставляются в конечной программе сознательно, в расчете на подключение в дальнейшем к работающей программе новых подпрограмм, реализующих некоторые новые возможности, либо предполагая возможное подключение к программе тестирующих средств для более точной настройки программы. Кто может дать гарантию, что в один прекрасный день такой заглушкой кто-нибудь не воспользуется для подключения к программе совсем иной подпрограммы, работающей в интересах этого "кого-нибудь", а не законного владельца?
Наконец, еще одним распространенным источником люков является так называемый "неопределенный ввод". Не так уж редка ситуация, когда программа создается неопытным программистом, исходящим из предположения, что пользователи будут работать с его программой всегда корректно. В этом случае реакция на неопределенный ввод может быть в лучшем случае непредсказуемой; гораздо хуже, если программа в случае одинакового неопределенного ввода выполняет некоторые повторяющиеся действия - это дает потенциальному захватчику возможность планировать свои действия по нарушению безопасности.
Таким образом, люк (или люки) может присутствовать в программе ввиду того, что программист:
- забыл удалить его;
- умышленно оставил его в программе для обеспечения тестирования или выполнения оставшейся части отладки;
- умышленно оставил его в программе в интересах облегчения окончательной сборки конечного программного продукта;
- умышленно оставил его в программе с тем, чтобы иметь скрытое средство доступа к программе уже после того, как она вошла в состав конечного продукта.
Троянский конь
Существуют программы, реализующие, помимо функций, описанных в документации, и некоторые другие функции, в документации не описанные. Такие программы называются "троянскими конями".
Логическая бомба
"Логической бомбой" обычно называют программу или даже участок кода в программе, реализующий некоторую функцию при выполнении определенного условия.
Мировая компьютерная общественность достаточно хорошо знакома с логическими бомбами. Логическая бомба является одним из излюбленных способов мести программистов компаниям, которые их уволили или чем-либо обидели. При этом чаще всего срабатывание бомбы ставится в зависимость от установки в системе даты - так называемые "часовые" бомбы. Это очень удобно: допустим, программист знает, что его уволят 1 марта; в таком случае он может установить "часовую" бомбу на взрыв, допустим, 6 июля или даже на Рождество, когда сам он будет уже вне пределов досягаемости для пострадавшей компании.
В этом отношении интересна высказанная одним из администраторов систем мысль, что при увольнении системного программиста будет лучше, если глава фирмы проводит его до дверей офиса, вежливо попрощается и подаст пальто.
Программные закладки
Для того чтобы закладка смогла выполнить какие-либо функции по отношению к другой прикладной программе, она должна получить управление на себя, то есть процессор должен начать выполнять инструкции, относящиеся к коду закладки.
Это возможно только при одновременном выполнении двух условий:
- закладка должна находиться в оперативной памяти до начала работы программы, на которую направлено ее воздействие;
- закладка должна активизироваться по некоторому общему для закладки и для прикладной программы событию.
Это достигается путем анализа и обработки закладкой общих относительно нее и прикладной программы событий, например, прерываний. Причем данные события должны сопровождать работу прикладной программы или работу всей ПЭВМ.
Исполнение кода закладки может быть сопровождено операциями несанкционированной записи (НСЗ), например, для сохранения некоторых фрагментов информации, и несанкционированного считывания (НСЧ), которое может происходить отдельно от операций чтения прикладной программы или совместно с ними. При этом операции считывания и записи, возможно, не связаны с получением конфиденциальной информации, например, считывание параметров устройства или его инициализация (закладка может использовать для своей работы и такие операции, в частности, для инициирования сбойных ситуаций или переназначения ввода-вывода).
Несанкционированная запись закладкой может происходить:
- в массив данных, не совпадающий с пользовательской информацией - сохранение информации;
- в массив данных, совпадающий с пользовательской информацией или ее подмножеством - искажение, уничтожение или навязывание информации закладкой.
Следовательно, можно рассматривать три основные группы деструктивных функций, которые могут выполняться закладками:
- сохранение фрагментов информации, возникающей при работе пользователей, прикладных программ, вводе-выводе данных, во внешней памяти сети (локальной или удаленной) или выделенной ПЭВМ, в том числе различных паролей, ключей и кодов доступа, собственно конфиденциальных документов в электронном виде;
- изменение алгоритмов функционирования прикладных программ (то есть целенаправленное воздействие во внешней или оперативной памяти), например, программа разграничения доступа станет пропускать пользователей по любому паролю;
- навязывание некоторого режима работы (например, при уничтожении информации - блокирование записи на диск, при этом информация, естественно, не уничтожается), либо замена записываемой информации информацией, навязанной закладкой (например, при выводе на экран слово "неверно" заменяется словом "верно", а "рубль" - "доллар" и т.д.).
Приведем несколько важных примеров. Предположим, что программное средство производит некоторые файловые операции. Для этого открывается файл, часть его считывается в буфер оперативной памяти, обрабатывается и затем, записывается в файл с прежним или новым именем.
Теперь представьте себе, что вводимые вами документы не записываются на диск или записываются в искаженном виде, либо сугубо конфиденциальная информация банка помимо записи в базу данных дополнена к файлу, посланному в сеть. Или вы дали команду зашифровать файл для передачи, а файл отправился "в путь" незашифрованным. Таковы лишь некоторые из широко известных негативных действий, могущих производиться закладками с файлами-документами.
Рассмотренные действия особенно опасны для программ подтверждения подлинности электронных документов ("электронная цифровая подпись" - ЭЦП). При считывании приготовленного для подписи файла-документа может произойти изменение имени автора, даты, времени, цифровых данных, заголовка документа (например, изменение суммы платежа в платежных поручениях и др.)
Закладки такого типа могут, например, навязывать истинность электронной подписи, даже если файл был изменен.
Широко известна и использовалась во многих банках система ЭЦП Pretty Good Privace (PGP). Многие стали жертвой простейшей программной закладки против этой системы.
Рассмотрим процесс "электронного подписывания", реализованный в программе PGP. Программа считывает файл для вычисления хеш-функции блоками по 512 байт, причем завершением процесса чтения является считывание блока меньшей длины.
Работа закладки была основана на навязывании длины файла. Закладка позволяет программе ЭЦП считать только первый 512-байтный блок и вычислять подпись только на его основе.
Такая же схема действует и при проверке подписи. Следовательно, основная часть файла может быть произвольным образом искажена.
Практика применения ЭЦП в системах автоматизированного финансового документооборота показала, что именно программная реализация ЭЦП наиболее сильно подвержена влиянию со стороны программных закладок, которые позволяют осуществлять проводки заведомо фальшивых финансовых документов и вмешиваться в порядок разрешения споров по факту применения ЭЦП.
Отметим четыре основных метода воздействия программных закладок на ЭЦП:
- Метод навязывания входной информации - связан с искажением поступающего на подпись файла.
- Метод навязывания результата проверки - связан с влиянием на признак правильности подписи независимо от результатов работы.
- Метод навязывания длины сообщения - предъявление программе ЭЦП электронного документа меньшей длины, следовательно, производится подпись только части документа.
- Метод искажения программы ЭЦП - связан с изменением исполняемого кода самой программы ЭЦП.
Задача борьбы с программными закладками весьма сложна и многопланова. Можно рассматривать следующие условия ее решения:
- Неизвестно наличие в каком-либо множестве программ фрагментов закладок, ставится задача определения факта их наличия или отсутствия; при этом программы не выполняются (статическая задача).
- В условиях п.1 программы используются по своему назначению, ставится та же задача выявления закладки, но в данном случае- по результатам работы (динамическая задача).
- Происходит обмен программным продуктом (в пространстве - передача по каналу связи или на материальном носителе, во времени - хранение), свободным от потенциально опасных действий, программный продукт не исполняется, задача защиты (статическая) ставится в трех вариантах:
- не допустить внедрения закладки;
- выявить внедренный код закладки;
- удалить внедренный код закладки.
- В условиях п.3 решается динамическая задача - защита от воздействия закладки в ходе работы программ.
- В условиях потенциальной возможности воздействия закладок решается задача борьбы с их итоговым влиянием, то есть закладки присутствуют в системе, но либо не активны при выполнении критических действий прикладных программ, либо результат их воздействия не конструктивен.
Далее рассмотренные задачи будем упоминать как Задачи 1-5.
С другой стороны, методы борьбы с воздействием закладок можно разделить на классы и увязать с проблемой защиты программного обеспечения вообще:
- Общие методы защиты программного обеспечения, решающие задачи борьбы со случайными сбоями оборудования и несанкционированным доступом:
- Контроль целостности системных областей, запускаемых прикладных программ и используемых данных (решение Задачи 3).
- Контроль критических для безопасности системы событий (решение Задачи 2).
Данные методы действенны лишь тогда, когда контрольные элементы не подвержены воздействию закладок и разрушающее воздействие входит в контролируемый класс. Так, например, система контроля за вызовом прерываний не будет отслеживать обращение на уровне портов. С другой стороны, контроль может быть обойден путем: - навязывания конечного результата проверок;
- влияния на процесс считывания информации;
- изменения хеш-функций, хранящихся в общедоступных файлах или в оперативной памяти.
Важно, что включение процесса контроля должно быть выполнено до начала влияния закладки, либо контроль должен осуществляться полностью аппаратно-программными средствами, содержащимися в ПЗУ.
- Создание безопасной и изолированной операционной среды (решение Задачи 4).
- Предотвращение результирующего воздействия вируса или закладки (например, запись на диск только в зашифрованном на уровне контроллера виде - тем самым сохранение информации закладкой не имеет смысла, либо запрет записи на диск на аппаратном уровне) (решение Задачи 5).
- Специальные методы выявления программ с потенциально опасными последствиями:
- Поиск фрагментов кода по характерным последовательностям (сигнатурам), свойственным закладкам, либо, наоборот, разрешение на выполнение или внедрение в цепочку прерываний только программам с известными сигнатурами (решение Задач 1,2).
- Поиск критических участков кода методом семантического анализа, то есть анализа фрагментов кода на выполняемые ими функции, например, выполнение НСЗ, часто сопряжено с дисассемблированием или эмуляцией выполнения (решение Задач 1,2).
Весьма важным является комплекс организационно-технических мер защиты от вирусов и программных закладок.
Меры защиты можно подразделить на две основные группы:
- Меры защиты на этапе разработки программного обеспечения (ПО) системы.
- Меры защиты на этапе эксплуатации.
В группу I входят:
- Меры защиты на этапе разработки прикладного ПО, содержащего внутреннюю защиту от НСД.
Они направлены на выявление в исходных текстах программ коммуникации и доступа некоторых фрагментов или подпрограмм, облегчающих или не регистрирующих доступ разработчиков программ (вход по фиксированным паролям, беспарольный доступ по нажатию некоторых клавиш, обход регистрации пользователей с фиксированными именами и т.д.). Наличие таких фрагментов фактически сведет на нет весь комплекс информационной безопасности системы, поскольку доступ через них возможен как человеку, так и программе-закладке. - Меры защиты при разработке ПО защиты от НСД (должны быть предусмотрены меры по проверке целостности хранимых на внешних носителях программных средств защиты, контроль целостности их в оперативной памяти и т.д.).
В группу II входят:
- Регулярные меры защиты и контроля, применяемые постоянно с фиксированными временными интервалами.
- Эпизодические защитные мероприятия (в дополнение к п.1 в период повышения опасности вирусного нападения).
- Локализационно-восстановительные меры, применяемые в случае проникновения и обнаружения закладок и причинения ими негативных последствий.
К общим способам защиты системы относятся:
- ограничение физического доступа к программам и оборудованию путем установления соответствующего организационного режима и применения аппаратных или программных средств ограничения доступа к ПЭВМ и ее компонентам;
- при активизации прикладного ПО контроль его целостности, целостности областей DOS, BIOS и CMOS путем просчета контрольных сумм (вычисления хеш-функций) и сравнения их с эталонными значениями для каждой ПЭВМ;
- максимальное ограничение и контроль за передачей по сети исполняемых файлов (типа .EXE и .COM), .SYS- и .BIN-файлов в целях предотвращения распространения файловых вирусов, вирусов типа Driver, загрузочно-файловых вирусов, а также размножающихся закладок по сети; использование фильтров и шлюзов при передаче данных;
- организация выборочного и внезапного контроля работы операторов ПЭВМ с целью выявления фактов использования нерегламентированного ПО;
- защита от записи на сменных носителях, учет и надежное хранение архивных копий;
- немедленное уничтожение ценной информации сразу по истечении потребности в ней;
- периодическая оптимизация внешних носителей (винчестеров) на предмет выявления сбойных или псевдосбойных кластеров и стирания фрагментов конфиденциальной информации при помощи средств типа SPEED DISK.
Средства защиты, учитывающие специфику работы фрагментов системы:
- для коммуникационных подсистем:
- средства и методы повышения общей надежности системы (программное или аппаратное дублирование, использование "горячего резерва" и т.д.);
- для серверов локальных сетей (СЛС):
- контроль состава и порядка использования ПО, находящегося на СЛС;
- дублирование стандартных средств защиты от НСД, входящих в состав сетевого ПО;
- запрет записи на общий диск файл-сервера локальной сети исполняемых файлов, не имеющих отношения к обработке информации в сети.
Что касается мер защиты от вирусов и закладок в процессе разработки самих программ защиты (п.2 группы I), то в данном случае необходимо предусмотреть:
- встроенный самоконтроль ПО системы защиты, установленный на сети, путем просчета контрольных сумм по файлам и коду программ в оперативной памяти;
- переопределение "на себя" существенно важных прерываний (int01h, 03h, 08h, 10h, 13h, 21h) для предотвращения перехвата ввода ключей и паролей и их сохранения закладкой на внешнем носителе, а также блокирование проникновения в логику работы программ защиты при помощи стандартных отладочных средств;
- защиту от переноса установленного ПО защиты коммуникации на другую ПЭВМ, проводимого с целью детального изучения ПО и поиска обходных путей для преодоления защиты; это может быть достигнуто "привязкой" ПО к индивидуальным параметрам ПЭВМ - тем самым работоспособность ПО будет обеспечиваться только на данной ЭВМ сети.
Атака салями
А теперь поговорим о биче банковских компьютерных систем - атаке "салями".
Чтобы понять смысл такой атаки, полезно вспомнить технологию изготовления известного сорта колбасы, которая создается путем соединения в общее целое множества мелких кусочков мяса. Получается достаточно вкусно.
При разработке банковских систем устанавливается правило округления (или усечения), используемое при выполнении всех операций. Вся хитрость состоит в том, как запрограммировать обработку округлений. Можно, конечно, просто удалять несуществующие величины. Но можно и не удалять, а накапливать на некоем специальном счете. Там пол цента, тут пол цента... - а в сумме? Как свидетельствует практика, сумма, составленная буквально из ничего, за пару лет эксплуатации "хитрой" программы в среднем по размеру банке, может исчисляться тысячами долларов.
Можно сказать, что атака салями - компьютерная реализация известной поговорки "С миру по нитке - голому рубаха".
Программные закладки при хаотичной "информатизации" финансовой сферы становятся мощным деструктивным фактором в ее развитии. Трудность обнаружения закладок и борьбы с их воздействием без преувеличения позволяет назвать их информационным оружием.
Легко понять недоумение и огорчение банкиров, видящих заведомо фальшивые платежные поручения, которые системы электронной подписи считают подлинными.
Чтобы избежать подобных разочарований, необходимо постоянно помнить об информационной угрозе и еще ... легенду о троянском коне.
Межсетевые экраны
Межсетевой экран или брандмауэр (по-нем. brandmauer, по-англ. firewall, по-рус. граница огня) - это система или комбинация систем, позволяющих разделить сеть на две или более частей и реализовать набор правил, определяющих условия прохождения пакетов из одной части в другую (см. рис.1). Чаще всего эта граница проводится между локальной сетью предприятия и INTERNET, хотя ее можно провести и внутри локальной сети предприятия. Брандмауэр, таким образом, пропускает через себя весь трафик. Для каждого проходящего пакета брандмауэр принимает решение пропускать его или отбросить. Для того чтобы брандмауэр мог принимать эти решения, ему необходимо определить набор правил. О том, как эти правила описываются и какие параметры используются при их описании, речь пойдет чуть позже.
рис.1
Как правило, брандмауэры функционируют на какой-либо UNIX платформе - чаще всего это BSDI, SunOS, AIX, IRIX и т.д., реже - DOS, VMS, WNT, Windows NT. Из аппаратных платформ встречаются INTEL, Sun SPARC, RS6000, Alpha, HP PA-RISC, семейство RISC процессоров R4400-R5000. Помимо Ethernet, многие брандмауэры поддерживают FDDI, Token Ring, 100Base-T, 100VG-AnyLan, различные серийные устройства. Требования к оперативной памяти и объему жесткого диска зависят от количества машин в защищаемом сегменте сети.
Обычно в операционную систему, под управлением которой работает брандмауэр, вносятся изменения, цель которых - повышение защиты самого брандмауэра. Эти изменения затрагивают как ядро ОС, так и соответствующие файлы конфигурации. На самом брандмауэре не разрешается иметь счета пользователей (а значит и потенциальных дыр), только счет администратора. Некоторые брандмауэры работают только в однопользовательском режиме. Многие брандмауэры имеют систему проверки целостности программных кодов. При этом контрольные суммы программных кодов хранятся в защищенном месте и сравниваются при старте программы во избежание подмены программного обеспечения.
Все брандмауэры можно разделить на три типа:
- пакетные фильтры (packet filter);
- сервера прикладного уровня (application gateways);
- сервера уровня соединения (circuit gateways).
Все типы могут одновременно встретиться в одном брандмауэре.
Пакетные фильтры
Брандмауэры с пакетными фильтрами принимают решение о том, пропускать пакет или отбросить, просматривая IP-адреса, флаги или номера TCP портов в заголовке этого пакета. IP-адрес и номер порта - это информация сетевого и транспортного уровней соответственно, но пакетные фильтры используют и информацию прикладного уровня, т.к. все стандартные сервисы в TCP/IP ассоциируются с определенным номером порта.
Для описания правил прохождения пакетов составляются таблицы типа:
Действие
| тип пакета
| адрес источн.
| порт источн.
| адрес назнач.
| порт назнач.
| флаги
| Поле "действие" может принимать значения пропустить или отбросить. Тип пакета - TCP, UDP или ICMP. Флаги - флаги из заголовка IP-пакета. Поля "порт источника" и "порт назначения" имеют смысл только для TCP и UDP пакетов.
Не нашли, что искали? Воспользуйтесь поиском по сайту:
©2015 - 2024 stydopedia.ru Все материалы защищены законодательством РФ.
|