feat: вкладка «Безопасность» — коды УБИ, автоподбор угроз (программа/ИИ), сравнение, новый UI

- угрозы ФСТЭК теперь с кодами: «УБИ.001 Угроза …» (парсинг кода из БДУ, 227 шт)
- threat_rules.py — логика программы: по характеристикам объекта (тип ИС/АСУ/ИТКС,
  интернет да/нет, нарушитель внутр./внешн.) фильтрует перечень по ключевым словам
- verify.py: suggest_threats_ai — ИИ предлагает актуальные угрозы по описанию объекта
- вкладка перестроена: компактная 2-колоночная раскладка, панель действий сверху:
  «⬇️ Загрузить угрозы ФСТЭК» | «⚙️ Подобрать (программа)» | «🤖 Подобрать (ИИ)» |
  «⚖️ Сравнить» | «🤖 Проверить безопасность через ИИ»
- окно выбора из словаря: 720x680 + поле поиска (фильтр по тексту, важно для 227 угроз)
- сравнение программа↔ИИ: окно с двумя списками, совпавшие подсвечены зелёным
This commit is contained in:
2026-08-04 17:44:54 +04:00
parent b6f595fd32
commit 7158a90b76
5 changed files with 676 additions and 348 deletions
+227 -227
View File
@@ -1,229 +1,229 @@
[ [
"Угроза автоматического распространения вредоносного кода в грид-системе", "УБИ.001 Угроза автоматического распространения вредоносного кода в грид-системе",
"Угроза агрегирования данных, передаваемых в грид-системе", "УБИ.002 Угроза агрегирования данных, передаваемых в грид-системе",
"Угроза использования слабостей криптографических алгоритмов и уязвимостей в программном обеспечении их реализации", "УБИ.003 Угроза использования слабостей криптографических алгоритмов и уязвимостей в программном обеспечении их реализации",
"Угроза аппаратного сброса пароля BIOS", "УБИ.004 Угроза аппаратного сброса пароля BIOS",
"Угроза внедрения вредоносного кода в BIOS", "УБИ.005 Угроза внедрения вредоносного кода в BIOS",
"Угроза внедрения кода или данных", "УБИ.006 Угроза внедрения кода или данных",
"Угроза воздействия на программы с высокими привилегиями", "УБИ.007 Угроза воздействия на программы с высокими привилегиями",
"Угроза восстановления и/или повторного использования аутентификационной информации", "УБИ.008 Угроза восстановления и/или повторного использования аутентификационной информации",
"Угроза восстановления предыдущей уязвимой версии BIOS", "УБИ.009 Угроза восстановления предыдущей уязвимой версии BIOS",
"Угроза выхода процесса за пределы виртуальной машины", "УБИ.010 Угроза выхода процесса за пределы виртуальной машины",
"Угроза деавторизации санкционированного клиента беспроводной сети", "УБИ.011 Угроза деавторизации санкционированного клиента беспроводной сети",
"Угроза деструктивного изменения конфигурации/среды окружения программ", "УБИ.012 Угроза деструктивного изменения конфигурации/среды окружения программ",
"Угроза деструктивного использования декларированного функционала BIOS", "УБИ.013 Угроза деструктивного использования декларированного функционала BIOS",
"Угроза длительного удержания вычислительных ресурсов пользователями", "УБИ.014 Угроза длительного удержания вычислительных ресурсов пользователями",
"Угроза доступа к защищаемым файлам с использованием обходного пути", "УБИ.015 Угроза доступа к защищаемым файлам с использованием обходного пути",
"Угроза доступа к локальным файлам сервера при помощи URL", "УБИ.016 Угроза доступа к локальным файлам сервера при помощи URL",
"Угроза доступа/перехвата/изменения HTTP cookies", "УБИ.017 Угроза доступа/перехвата/изменения HTTP cookies",
"Угроза загрузки нештатной операционной системы", "УБИ.018 Угроза загрузки нештатной операционной системы",
"Угроза заражения DNS-кеша", "УБИ.019 Угроза заражения DNS-кеша",
"Угроза злоупотребления возможностями, предоставленными потребителям облачных услуг", "УБИ.020 Угроза злоупотребления возможностями, предоставленными потребителям облачных услуг",
"Угроза злоупотребления доверием потребителей облачных услуг", "УБИ.021 Угроза злоупотребления доверием потребителей облачных услуг",
"Угроза избыточного выделения оперативной памяти", "УБИ.022 Угроза избыточного выделения оперативной памяти",
"Угроза изменения компонентов информационной (автоматизированной) системы", "УБИ.023 Угроза изменения компонентов информационной (автоматизированной) системы",
"Угроза изменения режимов работы аппаратных элементов компьютера", "УБИ.024 Угроза изменения режимов работы аппаратных элементов компьютера",
"Угроза изменения системных и глобальных переменных", "УБИ.025 Угроза изменения системных и глобальных переменных",
"Угроза искажения XML-схемы", "УБИ.026 Угроза искажения XML-схемы",
"Угроза искажения вводимой и выводимой на периферийные устройства информации", "УБИ.027 Угроза искажения вводимой и выводимой на периферийные устройства информации",
"Угроза использования альтернативных путей доступа к ресурсам", "УБИ.028 Угроза использования альтернативных путей доступа к ресурсам",
"Угроза использования вычислительных ресурсов суперкомпьютера «паразитными» процессами", "УБИ.029 Угроза использования вычислительных ресурсов суперкомпьютера «паразитными» процессами",
"Угроза использования информации идентификации/аутентификации, заданной по умолчанию", "УБИ.030 Угроза использования информации идентификации/аутентификации, заданной по умолчанию",
"Угроза использования механизмов авторизации для повышения привилегий", "УБИ.031 Угроза использования механизмов авторизации для повышения привилегий",
"Угроза использования поддельных цифровых подписей BIOS", "УБИ.032 Угроза использования поддельных цифровых подписей BIOS",
"Угроза использования слабостей кодирования входных данных", "УБИ.033 Угроза использования слабостей кодирования входных данных",
"Угроза использования слабостей протоколов сетевого/локального обмена данными", "УБИ.034 Угроза использования слабостей протоколов сетевого/локального обмена данными",
"Угроза использования слабых криптографических алгоритмов BIOS", "УБИ.035 Угроза использования слабых криптографических алгоритмов BIOS",
"Угроза исследования механизмов работы программы", "УБИ.036 Угроза исследования механизмов работы программы",
"Угроза исследования приложения через отчёты об ошибках", "УБИ.037 Угроза исследования приложения через отчёты об ошибках",
"Угроза исчерпания вычислительных ресурсов хранилища больших данных", "УБИ.038 Угроза исчерпания вычислительных ресурсов хранилища больших данных",
"Угроза исчерпания запаса ключей, необходимых для обновления BIOS", "УБИ.039 Угроза исчерпания запаса ключей, необходимых для обновления BIOS",
"Угроза конфликта юрисдикций различных стран", "УБИ.040 Угроза конфликта юрисдикций различных стран",
"Угроза межсайтового скриптинга", "УБИ.041 Угроза межсайтового скриптинга",
"Угроза межсайтовой подделки запроса", "УБИ.042 Угроза межсайтовой подделки запроса",
"Угроза нарушения доступности облачного сервера", "УБИ.043 Угроза нарушения доступности облачного сервера",
"Угроза нарушения изоляции пользовательских данных внутри виртуальной машины", "УБИ.044 Угроза нарушения изоляции пользовательских данных внутри виртуальной машины",
"Угроза нарушения изоляции среды исполнения BIOS", "УБИ.045 Угроза нарушения изоляции среды исполнения BIOS",
"Угроза нарушения процедуры аутентификации субъектов виртуального информационного взаимодействия", "УБИ.046 Угроза нарушения процедуры аутентификации субъектов виртуального информационного взаимодействия",
"Угроза нарушения работоспособности грид-системы при нетипичной сетевой нагрузке", "УБИ.047 Угроза нарушения работоспособности грид-системы при нетипичной сетевой нагрузке",
"Угроза нарушения технологии обработки информации путём несанкционированного внесения изменений в образы виртуальных машин", "УБИ.048 Угроза нарушения технологии обработки информации путём несанкционированного внесения изменений в образы виртуальных машин",
"Угроза нарушения целостности данных кеша", "УБИ.049 Угроза нарушения целостности данных кеша",
"Угроза неверного определения формата входных данных, поступающих в хранилище больших данных", "УБИ.050 Угроза неверного определения формата входных данных, поступающих в хранилище больших данных",
"Угроза невозможности восстановления сессии работы на ПЭВМ при выводе из промежуточных состояний питания", "УБИ.051 Угроза невозможности восстановления сессии работы на ПЭВМ при выводе из промежуточных состояний питания",
"Угроза невозможности миграции образов виртуальных машин из-за несовместимости аппаратного и программного обеспечения", "УБИ.052 Угроза невозможности миграции образов виртуальных машин из-за несовместимости аппаратного и программного обеспечения",
"Угроза невозможности управления правами пользователей BIOS", "УБИ.053 Угроза невозможности управления правами пользователей BIOS",
"Угроза недобросовестного исполнения обязательств поставщиками облачных услуг", "УБИ.054 Угроза недобросовестного исполнения обязательств поставщиками облачных услуг",
"Угроза незащищённого администрирования облачных услуг", "УБИ.055 Угроза незащищённого администрирования облачных услуг",
"Угроза некачественного переноса инфраструктуры в облако", "УБИ.056 Угроза некачественного переноса инфраструктуры в облако",
"Угроза неконтролируемого копирования данных внутри хранилища больших данных", "УБИ.057 Угроза неконтролируемого копирования данных внутри хранилища больших данных",
"Угроза неконтролируемого роста числа виртуальных машин", "УБИ.058 Угроза неконтролируемого роста числа виртуальных машин",
"Угроза неконтролируемого роста числа зарезервированных вычислительных ресурсов", "УБИ.059 Угроза неконтролируемого роста числа зарезервированных вычислительных ресурсов",
"Угроза неконтролируемого уничтожения информации хранилищем больших данных", "УБИ.060 Угроза неконтролируемого уничтожения информации хранилищем больших данных",
"Угроза некорректного задания структуры данных транзакции", "УБИ.061 Угроза некорректного задания структуры данных транзакции",
"Угроза некорректного использования прозрачного прокси-сервера за счёт плагинов браузера", "УБИ.062 Угроза некорректного использования прозрачного прокси-сервера за счёт плагинов браузера",
"Угроза некорректного использования функционала программного и аппаратного обеспечения", "УБИ.063 Угроза некорректного использования функционала программного и аппаратного обеспечения",
"Угроза некорректной реализации политики лицензирования в облаке", "УБИ.064 Угроза некорректной реализации политики лицензирования в облаке",
"Угроза неопределённости в распределении ответственности между ролями в облаке", "УБИ.065 Угроза неопределённости в распределении ответственности между ролями в облаке",
"Угроза неопределённости ответственности за обеспечение безопасности облака", "УБИ.066 Угроза неопределённости ответственности за обеспечение безопасности облака",
"Угроза неправомерного ознакомления с защищаемой информацией", "УБИ.067 Угроза неправомерного ознакомления с защищаемой информацией",
"Угроза неправомерного/некорректного использования интерфейса взаимодействия с приложением", "УБИ.068 Угроза неправомерного/некорректного использования интерфейса взаимодействия с приложением",
"Угроза неправомерных действий в каналах связи", "УБИ.069 Угроза неправомерных действий в каналах связи",
"Угроза непрерывной модернизации облачной инфраструктуры", "УБИ.070 Угроза непрерывной модернизации облачной инфраструктуры",
"Угроза несанкционированного восстановления удалённой защищаемой информации", "УБИ.071 Угроза несанкционированного восстановления удалённой защищаемой информации",
"Угроза несанкционированного выключения или обхода механизма защиты от записи в BIOS", "УБИ.072 Угроза несанкционированного выключения или обхода механизма защиты от записи в BIOS",
"Угроза несанкционированного доступа к активному и (или) пассивному виртуальному и (или) физическому сетевому оборудованию из физической и (или) виртуальной сети", "УБИ.073 Угроза несанкционированного доступа к активному и (или) пассивному виртуальному и (или) физическому сетевому оборудованию из физической и (или) виртуальной сети",
"Угроза несанкционированного доступа к аутентификационной информации", "УБИ.074 Угроза несанкционированного доступа к аутентификационной информации",
"Угроза несанкционированного доступа к виртуальным каналам передачи", "УБИ.075 Угроза несанкционированного доступа к виртуальным каналам передачи",
"Угроза несанкционированного доступа к гипервизору из виртуальной машины и (или) физической сети", "УБИ.076 Угроза несанкционированного доступа к гипервизору из виртуальной машины и (или) физической сети",
"Угроза несанкционированного доступа к данным за пределами зарезервированного адресного пространства, в том числе выделенного под виртуальное аппаратное обеспечение", "УБИ.077 Угроза несанкционированного доступа к данным за пределами зарезервированного адресного пространства, в том числе выделенного под виртуальное аппаратное обеспечение",
"Угроза несанкционированного доступа к защищаемым виртуальным машинам из виртуальной и (или) физической сети", "УБИ.078 Угроза несанкционированного доступа к защищаемым виртуальным машинам из виртуальной и (или) физической сети",
"Угроза несанкционированного доступа к защищаемым виртуальным машинам со стороны других виртуальных машин", "УБИ.079 Угроза несанкционированного доступа к защищаемым виртуальным машинам со стороны других виртуальных машин",
"Угроза несанкционированного доступа к защищаемым виртуальным устройствам из виртуальной и (или) физической сети", "УБИ.080 Угроза несанкционированного доступа к защищаемым виртуальным устройствам из виртуальной и (или) физической сети",
"Угроза несанкционированного доступа к локальному компьютеру через клиента грид-системы", "УБИ.081 Угроза несанкционированного доступа к локальному компьютеру через клиента грид-системы",
"Угроза несанкционированного доступа к сегментам вычислительного поля", "УБИ.082 Угроза несанкционированного доступа к сегментам вычислительного поля",
"Угроза несанкционированного доступа к системе по беспроводным каналам", "УБИ.083 Угроза несанкционированного доступа к системе по беспроводным каналам",
"Угроза несанкционированного доступа к системе хранения данных из виртуальной и (или) физической сети", "УБИ.084 Угроза несанкционированного доступа к системе хранения данных из виртуальной и (или) физической сети",
"Угроза несанкционированного доступа к хранимой в виртуальном пространстве защищаемой информации", "УБИ.085 Угроза несанкционированного доступа к хранимой в виртуальном пространстве защищаемой информации",
"Угроза несанкционированного изменения аутентификационной информации", "УБИ.086 Угроза несанкционированного изменения аутентификационной информации",
"Угроза несанкционированного использования привилегированных функций BIOS", "УБИ.087 Угроза несанкционированного использования привилегированных функций BIOS",
"Угроза несанкционированного копирования защищаемой информации", "УБИ.088 Угроза несанкционированного копирования защищаемой информации",
"Угроза несанкционированного редактирования реестра", "УБИ.089 Угроза несанкционированного редактирования реестра",
"Угроза несанкционированного создания учётной записи пользователя", "УБИ.090 Угроза несанкционированного создания учётной записи пользователя",
"Угроза несанкционированного удаления защищаемой информации", "УБИ.091 Угроза несанкционированного удаления защищаемой информации",
"Угроза несанкционированного удалённого внеполосного доступа к аппаратным средствам", "УБИ.092 Угроза несанкционированного удалённого внеполосного доступа к аппаратным средствам",
"Угроза несанкционированного управления буфером", "УБИ.093 Угроза несанкционированного управления буфером",
"Угроза несанкционированного управления синхронизацией и состоянием", "УБИ.094 Угроза несанкционированного управления синхронизацией и состоянием",
"Угроза несанкционированного управления указателями", "УБИ.095 Угроза несанкционированного управления указателями",
"Угроза несогласованности политик безопасности элементов облачной инфраструктуры", "УБИ.096 Угроза несогласованности политик безопасности элементов облачной инфраструктуры",
"Угроза несогласованности правил доступа к большим данным", "УБИ.097 Угроза несогласованности правил доступа к большим данным",
"Угроза обнаружения открытых портов и идентификации привязанных к ним сетевых служб", "УБИ.098 Угроза обнаружения открытых портов и идентификации привязанных к ним сетевых служб",
"Угроза обнаружения хостов", "УБИ.099 Угроза обнаружения хостов",
"Угроза обхода некорректно настроенных механизмов аутентификации", "УБИ.100 Угроза обхода некорректно настроенных механизмов аутентификации",
"Угроза общедоступности облачной инфраструктуры", "УБИ.101 Угроза общедоступности облачной инфраструктуры",
"Угроза опосредованного управления группой программ через совместно используемые данные", "УБИ.102 Угроза опосредованного управления группой программ через совместно используемые данные",
"Угроза определения типов объектов защиты", "УБИ.103 Угроза определения типов объектов защиты",
"Угроза определения топологии вычислительной сети", "УБИ.104 Угроза определения топологии вычислительной сети",
"Угроза отказа в загрузке входных данных неизвестного формата хранилищем больших данных", "УБИ.105 Угроза отказа в загрузке входных данных неизвестного формата хранилищем больших данных",
"Угроза отказа в обслуживании системой хранения данных суперкомпьютера", "УБИ.106 Угроза отказа в обслуживании системой хранения данных суперкомпьютера",
"Угроза отключения контрольных датчиков", "УБИ.107 Угроза отключения контрольных датчиков",
"Угроза ошибки обновления гипервизора", "УБИ.108 Угроза ошибки обновления гипервизора",
"Угроза перебора всех настроек и параметров приложения", "УБИ.109 Угроза перебора всех настроек и параметров приложения",
"Угроза перегрузки грид-системы вычислительными заданиями", "УБИ.110 Угроза перегрузки грид-системы вычислительными заданиями",
"Угроза передачи данных по скрытым каналам", "УБИ.111 Угроза передачи данных по скрытым каналам",
"Угроза передачи запрещённых команд на оборудование с числовым программным управлением", "УБИ.112 Угроза передачи запрещённых команд на оборудование с числовым программным управлением",
"Угроза перезагрузки аппаратных и программно-аппаратных средств вычислительной техники", "УБИ.113 Угроза перезагрузки аппаратных и программно-аппаратных средств вычислительной техники",
"Угроза переполнения целочисленных переменных", "УБИ.114 Угроза переполнения целочисленных переменных",
"Угроза перехвата вводимой и выводимой на периферийные устройства информации", "УБИ.115 Угроза перехвата вводимой и выводимой на периферийные устройства информации",
"Угроза перехвата данных, передаваемых по вычислительной сети", "УБИ.116 Угроза перехвата данных, передаваемых по вычислительной сети",
"Угроза перехвата привилегированного потока", "УБИ.117 Угроза перехвата привилегированного потока",
"Угроза перехвата привилегированного процесса", "УБИ.118 Угроза перехвата привилегированного процесса",
"Угроза перехвата управления гипервизором", "УБИ.119 Угроза перехвата управления гипервизором",
"Угроза перехвата управления средой виртуализации", "УБИ.120 Угроза перехвата управления средой виртуализации",
"Угроза повреждения системного реестра", "УБИ.121 Угроза повреждения системного реестра",
"Угроза повышения привилегий", "УБИ.122 Угроза повышения привилегий",
"Угроза подбора пароля BIOS", "УБИ.123 Угроза подбора пароля BIOS",
"Угроза подделки записей журнала регистрации событий", "УБИ.124 Угроза подделки записей журнала регистрации событий",
"Угроза подключения к беспроводной сети в обход процедуры аутентификации", "УБИ.125 Угроза подключения к беспроводной сети в обход процедуры аутентификации",
"Угроза подмены беспроводного клиента или точки доступа", "УБИ.126 Угроза подмены беспроводного клиента или точки доступа",
"Угроза подмены действия пользователя путём обмана", "УБИ.127 Угроза подмены действия пользователя путём обмана",
"Угроза подмены доверенного пользователя", "УБИ.128 Угроза подмены доверенного пользователя",
"Угроза подмены резервной копии программного обеспечения BIOS", "УБИ.129 Угроза подмены резервной копии программного обеспечения BIOS",
"Угроза подмены содержимого сетевых ресурсов", "УБИ.130 Угроза подмены содержимого сетевых ресурсов",
"Угроза подмены субъекта сетевого доступа", "УБИ.131 Угроза подмены субъекта сетевого доступа",
"Угроза получения предварительной информации об объекте защиты", "УБИ.132 Угроза получения предварительной информации об объекте защиты",
"Угроза получения сведений о владельце беспроводного устройства", "УБИ.133 Угроза получения сведений о владельце беспроводного устройства",
"Угроза потери доверия к поставщику облачных услуг", "УБИ.134 Угроза потери доверия к поставщику облачных услуг",
"Угроза потери и утечки данных, обрабатываемых в облаке", "УБИ.135 Угроза потери и утечки данных, обрабатываемых в облаке",
"Угроза потери информации вследствие несогласованности работы узлов хранилища больших данных", "УБИ.136 Угроза потери информации вследствие несогласованности работы узлов хранилища больших данных",
"Угроза потери управления облачными ресурсами", "УБИ.137 Угроза потери управления облачными ресурсами",
"Угроза потери управления собственной инфраструктурой при переносе её в облако", "УБИ.138 Угроза потери управления собственной инфраструктурой при переносе её в облако",
"Угроза преодоления физической защиты", "УБИ.139 Угроза преодоления физической защиты",
"Угроза приведения системы в состояние «отказ в обслуживании»", "УБИ.140 Угроза приведения системы в состояние «отказ в обслуживании»",
"Угроза привязки к поставщику облачных услуг", "УБИ.141 Угроза привязки к поставщику облачных услуг",
"Угроза приостановки оказания облачных услуг вследствие технических сбоев", "УБИ.142 Угроза приостановки оказания облачных услуг вследствие технических сбоев",
"Угроза программного выведения из строя средств хранения, обработки и (или) ввода/вывода/передачи информации", "УБИ.143 Угроза программного выведения из строя средств хранения, обработки и (или) ввода/вывода/передачи информации",
"Угроза программного сброса пароля BIOS", "УБИ.144 Угроза программного сброса пароля BIOS",
"Угроза пропуска проверки целостности программного обеспечения", "УБИ.145 Угроза пропуска проверки целостности программного обеспечения",
"Угроза прямого обращения к памяти вычислительного поля суперкомпьютера", "УБИ.146 Угроза прямого обращения к памяти вычислительного поля суперкомпьютера",
"Угроза распространения несанкционированно повышенных прав на всю грид-систему", "УБИ.147 Угроза распространения несанкционированно повышенных прав на всю грид-систему",
"Угроза сбоя автоматического управления системой разграничения доступа хранилища больших данных", "УБИ.148 Угроза сбоя автоматического управления системой разграничения доступа хранилища больших данных",
"Угроза сбоя обработки специальным образом изменённых файлов", "УБИ.149 Угроза сбоя обработки специальным образом изменённых файлов",
"Угроза сбоя процесса обновления BIOS", "УБИ.150 Угроза сбоя процесса обновления BIOS",
"Угроза сканирования веб-сервисов, разработанных на основе языка описания WSDL", "УБИ.151 Угроза сканирования веб-сервисов, разработанных на основе языка описания WSDL",
"Угроза удаления аутентификационной информации", "УБИ.152 Угроза удаления аутентификационной информации",
"Угроза усиления воздействия на вычислительные ресурсы пользователей при помощи сторонних серверов", "УБИ.153 Угроза усиления воздействия на вычислительные ресурсы пользователей при помощи сторонних серверов",
"Угроза установки уязвимых версий обновления программного обеспечения BIOS", "УБИ.154 Угроза установки уязвимых версий обновления программного обеспечения BIOS",
"Угроза утраты вычислительных ресурсов", "УБИ.155 Угроза утраты вычислительных ресурсов",
"Угроза утраты носителей информации", "УБИ.156 Угроза утраты носителей информации",
"Угроза физического выведения из строя средств хранения, обработки и (или) ввода/вывода/передачи информации", "УБИ.157 Угроза физического выведения из строя средств хранения, обработки и (или) ввода/вывода/передачи информации",
"Угроза форматирования носителей информации", "УБИ.158 Угроза форматирования носителей информации",
"Угроза «форсированного веб-браузинга»", "УБИ.159 Угроза «форсированного веб-браузинга»",
"Угроза хищения средств хранения, обработки и (или) ввода/вывода/передачи информации", "УБИ.160 Угроза хищения средств хранения, обработки и (или) ввода/вывода/передачи информации",
"Угроза чрезмерного использования вычислительных ресурсов суперкомпьютера в ходе интенсивного обмена межпроцессорными сообщениями", "УБИ.161 Угроза чрезмерного использования вычислительных ресурсов суперкомпьютера в ходе интенсивного обмена межпроцессорными сообщениями",
"Угроза эксплуатации цифровой подписи программного кода", "УБИ.162 Угроза эксплуатации цифровой подписи программного кода",
"Угроза перехвата исключения/сигнала из привилегированного блока функций", "УБИ.163 Угроза перехвата исключения/сигнала из привилегированного блока функций",
"Угроза распространения состояния «отказ в обслуживании» в облачной инфраструктуре", "УБИ.164 Угроза распространения состояния «отказ в обслуживании» в облачной инфраструктуре",
"Угроза включения в проект не достоверно испытанных компонентов", "УБИ.165 Угроза включения в проект не достоверно испытанных компонентов",
"Угроза внедрения системной избыточности", "УБИ.166 Угроза внедрения системной избыточности",
"Угроза заражения компьютера при посещении неблагонадёжных сайтов", "УБИ.167 Угроза заражения компьютера при посещении неблагонадёжных сайтов",
"Угроза «кражи» учётной записи доступа к сетевым сервисам", "УБИ.168 Угроза «кражи» учётной записи доступа к сетевым сервисам",
"Угроза наличия механизмов разработчика", "УБИ.169 Угроза наличия механизмов разработчика",
"Угроза неправомерного шифрования информации", "УБИ.170 Угроза неправомерного шифрования информации",
"Угроза скрытного включения вычислительного устройства в состав бот-сети", "УБИ.171 Угроза скрытного включения вычислительного устройства в состав бот-сети",
"Угроза распространения «почтовых червей»", "УБИ.172 Угроза распространения «почтовых червей»",
"Угроза «спама» веб-сервера", "УБИ.173 Угроза «спама» веб-сервера",
"Угроза «фарминга»", "УБИ.174 Угроза «фарминга»",
"Угроза «фишинга»", "УБИ.175 Угроза «фишинга»",
"Угроза нарушения технологического/производственного процесса из-за временны́х задержек, вносимых средством защиты", "УБИ.176 Угроза нарушения технологического/производственного процесса из-за временны́х задержек, вносимых средством защиты",
"Угроза неподтверждённого ввода данных оператором в систему, связанную с безопасностью", "УБИ.177 Угроза неподтверждённого ввода данных оператором в систему, связанную с безопасностью",
"Угроза несанкционированного использования системных и сетевых утилит", "УБИ.178 Угроза несанкционированного использования системных и сетевых утилит",
"Угроза несанкционированной модификации защищаемой информации", "УБИ.179 Угроза несанкционированной модификации защищаемой информации",
"Угроза отказа подсистемы обеспечения температурного режима", "УБИ.180 Угроза отказа подсистемы обеспечения температурного режима",
"Угроза перехвата одноразовых паролей в режиме реального времени", "УБИ.181 Угроза перехвата одноразовых паролей в режиме реального времени",
"Угроза физического устаревания аппаратных компонентов", "УБИ.182 Угроза физического устаревания аппаратных компонентов",
"Угроза перехвата управления автоматизированной системой управления технологическими процессами", "УБИ.183 Угроза перехвата управления автоматизированной системой управления технологическими процессами",
"Угроза агрегирования данных, обрабатываемых с помощью мобильного устройства", "УБИ.184 Угроза агрегирования данных, обрабатываемых с помощью мобильного устройства",
"Угроза несанкционированного изменения параметров настройки средств защиты информации", "УБИ.185 Угроза несанкционированного изменения параметров настройки средств защиты информации",
"Угроза внедрения вредоносного кода через рекламу, сервисы и контент", "УБИ.186 Угроза внедрения вредоносного кода через рекламу, сервисы и контент",
"Угроза несанкционированного воздействия на средство защиты информации", "УБИ.187 Угроза несанкционированного воздействия на средство защиты информации",
"Угроза подмены программного обеспечения", "УБИ.188 Угроза подмены программного обеспечения",
"Угроза маскирования действий вредоносного кода", "УБИ.189 Угроза маскирования действий вредоносного кода",
"Угроза внедрения вредоносного кода за счет посещения зараженных сайтов в сети Интернет", "УБИ.190 Угроза внедрения вредоносного кода за счет посещения зараженных сайтов в сети Интернет",
"Угроза внедрения вредоносного кода в дистрибутив программного обеспечения", "УБИ.191 Угроза внедрения вредоносного кода в дистрибутив программного обеспечения",
"Угроза использования уязвимых версий программного обеспечения", "УБИ.192 Угроза использования уязвимых версий программного обеспечения",
"Угроза утечки информации за счет применения вредоносным программным обеспечением алгоритмов шифрования трафика", "УБИ.193 Угроза утечки информации за счет применения вредоносным программным обеспечением алгоритмов шифрования трафика",
"Угроза несанкционированного использования привилегированных функций мобильного устройства", "УБИ.194 Угроза несанкционированного использования привилегированных функций мобильного устройства",
"Угроза удаленного запуска вредоносного кода в обход механизмов защиты операционной системы", "УБИ.195 Угроза удаленного запуска вредоносного кода в обход механизмов защиты операционной системы",
"Угроза контроля вредоносной программой списка приложений, запущенных на мобильном устройстве", "УБИ.196 Угроза контроля вредоносной программой списка приложений, запущенных на мобильном устройстве",
"Угроза хищения аутентификационной информации из временных файлов cookie", "УБИ.197 Угроза хищения аутентификационной информации из временных файлов cookie",
"Угроза скрытной регистрации вредоносной программой учетных записей администраторов", "УБИ.198 Угроза скрытной регистрации вредоносной программой учетных записей администраторов",
"Угроза перехвата управления мобильного устройства при использовании виртуальных голосовых ассистентов", "УБИ.199 Угроза перехвата управления мобильного устройства при использовании виртуальных голосовых ассистентов",
"Угроза хищения информации с мобильного устройства при использовании виртуальных голосовых ассистентов", "УБИ.200 Угроза хищения информации с мобильного устройства при использовании виртуальных голосовых ассистентов",
"Угроза утечки пользовательских данных при использовании функций автоматического заполнения аутентификационной информации в браузере", "УБИ.201 Угроза утечки пользовательских данных при использовании функций автоматического заполнения аутентификационной информации в браузере",
"Угроза несанкционированной установки приложений на мобильные устройства", "УБИ.202 Угроза несанкционированной установки приложений на мобильные устройства",
"Угроза утечки информации с неподключенных к сети Интернет компьютеров", "УБИ.203 Угроза утечки информации с неподключенных к сети Интернет компьютеров",
"Угроза несанкционированного изменения вредоносной программой значений параметров программируемых логических контроллеров", "УБИ.204 Угроза несанкционированного изменения вредоносной программой значений параметров программируемых логических контроллеров",
"Угроза нарушения работы компьютера и блокирования доступа к его данным из-за некорректной работы установленных на нем средств защиты", "УБИ.205 Угроза нарушения работы компьютера и блокирования доступа к его данным из-за некорректной работы установленных на нем средств защиты",
"Угроза отказа в работе оборудования из-за изменения геолокационной информации о нем", "УБИ.206 Угроза отказа в работе оборудования из-за изменения геолокационной информации о нем",
"Угроза несанкционированного доступа к параметрам настройки оборудования за счет использования «мастер-кодов» (инженерных паролей)", "УБИ.207 Угроза несанкционированного доступа к параметрам настройки оборудования за счет использования «мастер-кодов» (инженерных паролей)",
"Угроза нецелевого использования вычислительных ресурсов средства вычислительной техники", "УБИ.208 Угроза нецелевого использования вычислительных ресурсов средства вычислительной техники",
"Угроза несанкционированного доступа к защищаемой памяти \r\nядра процессора", "УБИ.209 Угроза несанкционированного доступа к защищаемой памяти \r\nядра процессора",
"Угроза нарушения работы информационной системы, вызванного обновлением используемого в ней программного обеспечения", "УБИ.210 Угроза нарушения работы информационной системы, вызванного обновлением используемого в ней программного обеспечения",
"Угроза использования непроверенных пользовательских данных при формировании конфигурационного файла, используемого программным обеспечением администрирования информационных систем", "УБИ.211 Угроза использования непроверенных пользовательских данных при формировании конфигурационного файла, используемого программным обеспечением администрирования информационных систем",
"Угроза перехвата управления информационной системой", "УБИ.212 Угроза перехвата управления информационной системой",
"Угроза обхода многофакторной аутентификации", "УБИ.213 Угроза обхода многофакторной аутентификации",
"Угроза несвоевременного выявления и реагирования компонентами информационной (автоматизированной) системы (в том числе средствами защиты информации) на события безопасности информации", "УБИ.214 Угроза несвоевременного выявления и реагирования компонентами информационной (автоматизированной) системы (в том числе средствами защиты информации) на события безопасности информации",
"Угроза несанкционированного доступа к системе при помощи сторонних сервисов", "УБИ.215 Угроза несанкционированного доступа к системе при помощи сторонних сервисов",
"Угроза получения несанкционированного доступа к приложениям, установленным на Smart-картах", "УБИ.216 Угроза получения несанкционированного доступа к приложениям, установленным на Smart-картах",
"Угроза использования скомпрометированного доверенного источника обновлений программного обеспечения", "УБИ.217 Угроза использования скомпрометированного доверенного источника обновлений программного обеспечения",
"Угроза раскрытия информации о модели машинного обучения", "УБИ.218 Угроза раскрытия информации о модели машинного обучения",
"Угроза хищения обучающих данных", "УБИ.219 Угроза хищения обучающих данных",
"Угроза нарушения функционирования («обхода») средств, реализующих технологии искусственного интеллекта", "УБИ.220 Угроза нарушения функционирования («обхода») средств, реализующих технологии искусственного интеллекта",
"Угроза модификации модели машинного обучения путем искажения («отравления») обучающих данных", "УБИ.221 Угроза модификации модели машинного обучения путем искажения («отравления») обучающих данных",
"Угроза подмены модели машинного обучения", "УБИ.222 Угроза подмены модели машинного обучения",
"Угроза несанкционированного доступа к контейнерам, предоставляющего пользователям расширенные привилегии", "УБИ.223 Угроза несанкционированного доступа к контейнерам, предоставляющего пользователям расширенные привилегии",
"Угроза нарушения целостности (подмены) контейнеров", "УБИ.224 Угроза нарушения целостности (подмены) контейнеров",
"Угроза нарушения изоляции контейнеров", "УБИ.225 Угроза нарушения изоляции контейнеров",
"Угроза внедрения вредоносного программного обеспечения в контейнеры", "УБИ.226 Угроза внедрения вредоносного программного обеспечения в контейнеры",
"Угроза модификации (подмены) образов контейнеров" "УБИ.227 Угроза модификации (подмены) образов контейнеров"
] ]
+26 -13
View File
@@ -49,29 +49,42 @@ def _fetch(url, timeout=30):
return None return None
def _normalize_ubi(code):
"""«УБИ. 001» / «УБИ.001» → «УБИ.001» (без пробела после точки)."""
m = re.search(r'(УБИ\.?)\s*([\d.]+)', code or '', re.I)
if m:
return f"{m.group(1).replace('.', '').upper()}.{m.group(2)}"
return (code or '').strip()
def _parse_threats(html): def _parse_threats(html):
"""Извлекает названия угроз из HTML-таблицы БДУ. """Извлекает пары (код УБИ, название) из HTML-таблицы БДУ.
Строки вида: <tr>...<td>УБИ. 001</td><td>Угроза ...</td>...</tr> Строки вида: <tr>...<td>УБИ. 001</td><td>Угроза ...</td>...</tr>
Возвращает список названий (без кода). Возвращает список строк: «УБИ.001 Угроза ...» (код + название).
""" """
names = [] items = []
if not html: if not html:
return names return items
for row in re.findall(r'<tr[^>]*>(.*?)</tr>', html, re.S): for row in re.findall(r'<tr[^>]*>(.*?)</tr>', html, re.S):
cells = re.findall(r'<t[dh][^>]*>(.*?)</t[dh]>', row, re.S) cells = re.findall(r'<t[dh][^>]*>(.*?)</t[dh]>', row, re.S)
cleaned = [re.sub(r'<[^>]+>', '', c).strip() for c in cells] cleaned = [re.sub(r'<[^>]+>', '', c).strip() for c in cells]
# формат: [код, название, ...] — берём ячейку, которая не похожа на код УБИ if not cleaned:
for cell in cleaned:
if not cell:
continue continue
if re.fullmatch(r'УБИ\.?\s*[\d.]+', cell): # первая ячейка — код (УБИ.001), вторая — название
continue code = _normalize_ubi(cleaned[0]) if cleaned else ''
if cell in ('', 'Идентификатор', 'Наименование', 'Дата', 'Уровень опасности'): name = ''
continue for cell in cleaned[1:]:
names.append(cell) if cell and cell not in ('', 'Идентификатор', 'Наименование', 'Дата', 'Уровень опасности'):
name = cell
break break
return names if not name:
continue
if code.startswith('УБИ.'):
items.append(f"{code} {name}")
else:
items.append(name)
return items
def download_fstec_threats(dict_dir=None, max_pages=8, page_size=100): def download_fstec_threats(dict_dir=None, max_pages=8, page_size=100):
+168
View File
@@ -0,0 +1,168 @@
# -*- coding: utf-8 -*-
"""DokoGen — автоматический подбор угроз безопасности информации (236 приказ).
Логика программы: по характеристикам объекта КИИ (тип, сеть, нарушитель)
подбирает актуальные угрозы из перечня БДУ ФСТЭК (threats_fstec.json).
Если перечень не скачан использует базовый threats.json.
Правила эвристические; при наличии методического документа (например,
«Методика оценки угроз безопасности информации» ФСТЭК) адаптируются под него.
"""
import os
import json
def load_threats(dict_dir=None):
"""Список угроз: сначала скачанный с ФСТЭК (с кодами УБИ), иначе базовый."""
if dict_dir is None:
dict_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'dictionaries')
fstec = os.path.join(dict_dir, 'threats_fstec.json')
if os.path.exists(fstec):
try:
with open(fstec, encoding='utf-8') as f:
data = json.load(f)
if data:
return data
except Exception:
pass
base = os.path.join(dict_dir, 'threats.json')
try:
with open(base, encoding='utf-8') as f:
return json.load(f)
except Exception:
return []
# ---------------------------------------------------------------
# Ключевые слова (в названии угрозы) по признакам объекта
# ---------------------------------------------------------------
# Базовый набор — актуален для любого объекта КИИ
BASE_KEYWORDS = [
'вредоносн', 'несанкционированн', 'утечк', 'перехват', 'модификац',
'уничтожен', 'отказ в обслуживании', 'нсд', 'биос', 'пароль',
'криптографическ', 'шифрован', 'аутентификац',
]
# Объект имеет подключение к сети Интернет / сеть электросвязи
INTERNET_KEYWORDS = [
'удалённ', 'удаленн', 'сетев', 'фишинг', 'ddos', 'отказ в обслуживании',
'веб', 'электронн', 'почт', 'беспроводн', 'wi-fi', 'wifi', 'vpn',
'маршрутизац', 'протокол', 'интернет',
]
# Объект изолирован (нет подключения к Интернету)
ISOLATED_KEYWORDS = [
'съёмн', 'съемн', 'физическ', 'локальн', 'инсайд', 'носител',
'биос', 'желез', 'аппаратн',
]
# АСУ / технологический процесс
ASU_KEYWORDS = [
'технологическ', 'асутп', 'промышленн', 'scada', 'датчик',
'исполнительн', 'технологическ', 'производств', 'процесс',
]
# ИТКС / сети связи
NETWORK_KEYWORDS = [
'сеть', 'канал', 'протокол', 'маршрутизац', 'связ', 'передач',
'коммутац', 'трафик',
]
# Внутренний нарушитель
INSIDER_KEYWORDS = [
'инсайд', 'сотрудник', 'привилегированн', 'администратор',
'внутренн', 'персонал',
]
# Внешний нарушитель
EXTERNAL_KEYWORDS = [
'внешн', 'удалённ', 'удаленн', 'дистанционн',
]
def _is_asu(isys) -> bool:
t = (getattr(isys, 'object_type', '') or '').lower()
return 'асу' in t or 'автоматизированн' in t or 'технологическ' in t
def _is_network(isys) -> bool:
t = (getattr(isys, 'object_type', '') or '').lower()
return 'телекоммуникац' in t or 'сеть' in t
def _has_internet(isys) -> bool:
"""Есть ли подключение к сети Интернет / внешним сетям."""
if getattr(isys, 'is_internet', False):
return True
# По описанию / сетям: «отсутствует подключение к сети Интернет» → нет
desc = ((getattr(isys, 'description', '') or '') + ' ' +
(getattr(isys, 'net_operator', '') or '')).lower()
if 'отсутств' in desc and ('интернет' in desc or 'подключ' in desc):
return False
net_category = (getattr(isys, 'net_category', '') or '').lower()
if net_category:
return True
# По умолчанию считаем, что сеть есть (осторожная оценка)
return True
def _is_insider(isys) -> bool:
a = (getattr(isys, 'attacker_category', '') or '').lower()
return 'внутрен' in a
def _score(threat_lower, keywords):
"""Сколько ключевых слов встретилось в названии угрозы."""
return sum(1 for kw in keywords if kw in threat_lower)
def suggest_threats_program(isys, threats=None, limit=15):
"""Подбор угроз по характеристикам объекта КИИ.
Возвращает список строк (с кодами УБИ, если они есть в перечне).
"""
if threats is None:
threats = load_threats()
if not threats:
return []
has_internet = _has_internet(isys)
is_asu = _is_asu(isys)
is_network = _is_network(isys)
insider = _is_insider(isys)
# Собираем активные наборы ключевых слов
active = list(BASE_KEYWORDS)
if has_internet:
active += INTERNET_KEYWORDS
else:
active += ISOLATED_KEYWORDS
if is_asu:
active += ASU_KEYWORDS
if is_network:
active += NETWORK_KEYWORDS
if insider:
active += INSIDER_KEYWORDS
else:
active += EXTERNAL_KEYWORDS
scored = []
for t in threats:
tl = str(t).lower()
s = _score(tl, active)
if s > 0:
scored.append((s, t))
# Сортировка: больше совпадений — выше; убираем дубликаты, сохраняя порядок
scored.sort(key=lambda x: -x[0])
result = []
seen = set()
for s, t in scored:
if t in seen:
continue
seen.add(t)
result.append(t)
if len(result) >= limit:
break
return result
+224 -106
View File
@@ -944,13 +944,37 @@ class DokoGenApp:
# ===== Вкладка «Безопасность» ===== # ===== Вкладка «Безопасность» =====
sec_tab = ttk.Frame(nb2) sec_tab = ttk.Frame(nb2)
nb2.add(sec_tab, text="Безопасность") nb2.add(sec_tab, text="Безопасность")
sec_frame = ttk.Frame(sec_tab, padding=8) sec_frame = ttk.Frame(sec_tab, padding=6)
sec_frame.pack(fill=tk.BOTH, expand=True) sec_frame.pack(fill=tk.BOTH, expand=True)
# --- Категория нарушителя (словарик) --- # --- Панель действий (сверху, всегда видна) ---
ttk.Label(sec_frame, text="Категория нарушителя:").grid(row=0, column=0, sticky=tk.W, pady=2) sec_actions = ttk.Frame(sec_frame)
self.is_attacker_category_combo = ttk.Combobox(sec_frame, width=68, state='readonly') sec_actions.pack(fill=tk.X, pady=(0, 6))
self.is_attacker_category_combo.grid(row=0, column=1, padx=8, sticky=tk.EW, pady=1) ttk.Button(sec_actions, text="⬇️ Загрузить угрозы ФСТЭК",
command=self._download_fstec_threats).pack(side=tk.LEFT, padx=2)
ttk.Button(sec_actions, text="⚙️ Подобрать угрозы (программа)",
command=self._suggest_threats_program_click).pack(side=tk.LEFT, padx=2)
ttk.Button(sec_actions, text="🤖 Подобрать угрозы (ИИ)",
command=self._suggest_threats_ai_click).pack(side=tk.LEFT, padx=2)
ttk.Button(sec_actions, text="⚖️ Сравнить",
command=self._compare_threats).pack(side=tk.LEFT, padx=2)
ttk.Button(sec_actions, text="🤖 Проверить безопасность через ИИ",
command=self._check_security_ai).pack(side=tk.LEFT, padx=2)
self._threats_date_label = ttk.Label(sec_actions, text="", foreground='gray')
self._threats_date_label.pack(side=tk.LEFT, padx=8)
# --- Две колонки: слева нарушитель+угрозы, справа остальное ---
sec_cols = ttk.Frame(sec_frame)
sec_cols.pack(fill=tk.BOTH, expand=True)
sec_left = ttk.Frame(sec_cols)
sec_left.pack(side=tk.LEFT, fill=tk.BOTH, expand=True, padx=(0, 6))
sec_right = ttk.Frame(sec_cols)
sec_right.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)
# ===== Левая колонка =====
ttk.Label(sec_left, text="Категория нарушителя:").pack(anchor=tk.W)
self.is_attacker_category_combo = ttk.Combobox(sec_left, state='readonly')
self.is_attacker_category_combo.pack(fill=tk.X, pady=(2, 4))
try: try:
import json as _json import json as _json
_ac = os.path.join(os.path.dirname(__file__), 'dictionaries', 'attacker_categories.json') _ac = os.path.join(os.path.dirname(__file__), 'dictionaries', 'attacker_categories.json')
@@ -959,25 +983,27 @@ class DokoGenApp:
except Exception: except Exception:
pass pass
# --- Характеристика нарушителя --- ttk.Label(sec_left, text="Характеристика нарушителя:").pack(anchor=tk.W)
ttk.Label(sec_frame, text="Характеристика нарушителя:").grid(row=1, column=0, sticky=tk.NW, pady=2) sec_char_row = ttk.Frame(sec_left)
self.is_attacker_characteristics_listbox = tk.Listbox(sec_frame, height=3, exportselection=False) sec_char_row.pack(fill=tk.X, pady=(2, 4))
self.is_attacker_characteristics_listbox.grid(row=1, column=1, sticky=tk.EW, padx=(8, 4), pady=1) self.is_attacker_characteristics_listbox = tk.Listbox(sec_char_row, height=2, exportselection=False)
sec_char_btn = ttk.Frame(sec_frame) self.is_attacker_characteristics_listbox.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)
sec_char_btn.grid(row=1, column=2, sticky=tk.N, padx=(4, 0)) sec_char_btn = ttk.Frame(sec_char_row)
ttk.Button(sec_char_btn, text="+ Добавить", sec_char_btn.pack(side=tk.RIGHT, padx=(4, 0))
command=lambda: self._add_sw_item(self.is_attacker_characteristics_listbox)).pack(fill=tk.X, pady=1) ttk.Button(sec_char_btn, text="+", width=2,
ttk.Button(sec_char_btn, text="- Удалить", command=lambda: self._add_sw_item(self.is_attacker_characteristics_listbox)).pack(pady=1)
command=lambda: self._del_sw_item(self.is_attacker_characteristics_listbox)).pack(fill=tk.X, pady=1) ttk.Button(sec_char_btn, text="-", width=2,
ttk.Button(sec_char_btn, text="✏️ Редактировать", command=lambda: self._del_sw_item(self.is_attacker_characteristics_listbox)).pack(pady=1)
command=lambda: self._edit_sw_item(self.is_attacker_characteristics_listbox)).pack(fill=tk.X, pady=1) ttk.Button(sec_char_btn, text="✏️", width=3,
command=lambda: self._edit_sw_item(self.is_attacker_characteristics_listbox)).pack(pady=1)
# --- Основные угрозы БИ (словарик + загрузка с ФСТЭК) --- ttk.Label(sec_left, text="Основные угрозы БИ:").pack(anchor=tk.W)
ttk.Label(sec_frame, text="Основные угрозы БИ:").grid(row=2, column=0, sticky=tk.W, pady=2) sec_thr_row = ttk.Frame(sec_left)
self.is_threats_listbox = tk.Listbox(sec_frame, height=5, exportselection=False) sec_thr_row.pack(fill=tk.BOTH, expand=True, pady=(2, 4))
self.is_threats_listbox.grid(row=2, column=1, sticky=tk.EW, padx=(8, 4), pady=1) self.is_threats_listbox = tk.Listbox(sec_thr_row, height=7, exportselection=False)
sec_thr_btn = ttk.Frame(sec_frame) self.is_threats_listbox.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)
sec_thr_btn.grid(row=2, column=2, sticky=tk.N, padx=(4, 0)) sec_thr_btn = ttk.Frame(sec_thr_row)
sec_thr_btn.pack(side=tk.RIGHT, padx=(4, 0))
ttk.Button(sec_thr_btn, text="+ Добавить", ttk.Button(sec_thr_btn, text="+ Добавить",
command=lambda: self._add_sw_item(self.is_threats_listbox)).pack(fill=tk.X, pady=1) command=lambda: self._add_sw_item(self.is_threats_listbox)).pack(fill=tk.X, pady=1)
ttk.Button(sec_thr_btn, text="- Удалить", ttk.Button(sec_thr_btn, text="- Удалить",
@@ -986,90 +1012,38 @@ class DokoGenApp:
command=lambda: self._edit_sw_item(self.is_threats_listbox)).pack(fill=tk.X, pady=1) command=lambda: self._edit_sw_item(self.is_threats_listbox)).pack(fill=tk.X, pady=1)
ttk.Button(sec_thr_btn, text="📚 Из словаря", ttk.Button(sec_thr_btn, text="📚 Из словаря",
command=lambda: self._select_sw_from_dict(self.is_threats_listbox, 'threats_fstec.json')).pack(fill=tk.X, pady=1) command=lambda: self._select_sw_from_dict(self.is_threats_listbox, 'threats_fstec.json')).pack(fill=tk.X, pady=1)
ttk.Button(sec_thr_btn, text="⬇️ Загрузить угрозы ФСТЭК",
command=self._download_fstec_threats).pack(fill=tk.X, pady=1)
self._threats_date_label = ttk.Label(sec_frame, text="", foreground='gray')
self._threats_date_label.grid(row=3, column=1, sticky=tk.W, padx=8, pady=(0, 2))
# --- Типы компьютерных инцидентов (словарик) --- # ===== Правая колонка =====
ttk.Label(sec_frame, text="Типы компьютерных инцидентов:").grid(row=4, column=0, sticky=tk.W, pady=2) def _sec_row(parent, label, attr, dict_name=None, height=2):
self.is_incidents_listbox = tk.Listbox(sec_frame, height=4, exportselection=False) """Ряд: label + listbox + кнопки (+/-/✏️/📚)."""
self.is_incidents_listbox.grid(row=4, column=1, sticky=tk.EW, padx=(8, 4), pady=1) ttk.Label(parent, text=label).pack(anchor=tk.W)
sec_inc_btn = ttk.Frame(sec_frame) row = ttk.Frame(parent)
sec_inc_btn.grid(row=4, column=2, sticky=tk.N, padx=(4, 0)) row.pack(fill=tk.X, pady=(2, 4))
ttk.Button(sec_inc_btn, text="+ Добавить", lb = tk.Listbox(row, height=height, exportselection=False)
command=lambda: self._add_sw_item(self.is_incidents_listbox)).pack(fill=tk.X, pady=1) lb.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)
ttk.Button(sec_inc_btn, text="- Удалить", setattr(self, attr, lb)
command=lambda: self._del_sw_item(self.is_incidents_listbox)).pack(fill=tk.X, pady=1) btns = ttk.Frame(row)
ttk.Button(sec_inc_btn, text="✏️ Редактировать", btns.pack(side=tk.RIGHT, padx=(4, 0))
command=lambda: self._edit_sw_item(self.is_incidents_listbox)).pack(fill=tk.X, pady=1) ttk.Button(btns, text="+", width=2,
ttk.Button(sec_inc_btn, text="📚 Из словаря", command=lambda l=lb: self._add_sw_item(l)).pack(pady=1)
command=lambda: self._select_sw_from_dict(self.is_incidents_listbox, 'incidents.json')).pack(fill=tk.X, pady=1) ttk.Button(btns, text="-", width=2,
command=lambda l=lb: self._del_sw_item(l)).pack(pady=1)
ttk.Button(btns, text="✏️", width=3,
command=lambda l=lb: self._edit_sw_item(l)).pack(pady=1)
if dict_name:
ttk.Button(btns, text="📚", width=3,
command=lambda l=lb, d=dict_name: self._select_sw_from_dict(l, d)).pack(pady=1)
# --- Показатели критериев значимости (словарик) --- _sec_row(sec_right, "Типы компьютерных инцидентов:",
ttk.Label(sec_frame, text="Показатели критериев значимости:").grid(row=5, column=0, sticky=tk.W, pady=2) 'is_incidents_listbox', 'incidents.json', height=2)
self.is_criteria_values_listbox = tk.Listbox(sec_frame, height=4, exportselection=False) _sec_row(sec_right, "Показатели критериев значимости:",
self.is_criteria_values_listbox.grid(row=5, column=1, sticky=tk.EW, padx=(8, 4), pady=1) 'is_criteria_values_listbox', 'criteria_indicators.json', height=2)
sec_crit_btn = ttk.Frame(sec_frame) _sec_row(sec_right, "Обоснование значений показателей:",
sec_crit_btn.grid(row=5, column=2, sticky=tk.N, padx=(4, 0)) 'is_criteria_justification_listbox', None, height=2)
ttk.Button(sec_crit_btn, text="+ Добавить", _sec_row(sec_right, "Организационные меры:",
command=lambda: self._add_sw_item(self.is_criteria_values_listbox)).pack(fill=tk.X, pady=1) 'is_org_measures_listbox', 'org_measures.json', height=2)
ttk.Button(sec_crit_btn, text="- Удалить", _sec_row(sec_right, "Технические меры:",
command=lambda: self._del_sw_item(self.is_criteria_values_listbox)).pack(fill=tk.X, pady=1) 'is_tech_measures_listbox', 'tech_measures.json', height=2)
ttk.Button(sec_crit_btn, text="✏️ Редактировать",
command=lambda: self._edit_sw_item(self.is_criteria_values_listbox)).pack(fill=tk.X, pady=1)
ttk.Button(sec_crit_btn, text="📚 Из словаря",
command=lambda: self._select_sw_from_dict(self.is_criteria_values_listbox, 'criteria_indicators.json')).pack(fill=tk.X, pady=1)
# --- Обоснование значений показателей ---
ttk.Label(sec_frame, text="Обоснование значений показателей:").grid(row=6, column=0, sticky=tk.NW, pady=2)
self.is_criteria_justification_listbox = tk.Listbox(sec_frame, height=3, exportselection=False)
self.is_criteria_justification_listbox.grid(row=6, column=1, sticky=tk.EW, padx=(8, 4), pady=1)
sec_just_btn = ttk.Frame(sec_frame)
sec_just_btn.grid(row=6, column=2, sticky=tk.N, padx=(4, 0))
ttk.Button(sec_just_btn, text="+ Добавить",
command=lambda: self._add_sw_item(self.is_criteria_justification_listbox)).pack(fill=tk.X, pady=1)
ttk.Button(sec_just_btn, text="- Удалить",
command=lambda: self._del_sw_item(self.is_criteria_justification_listbox)).pack(fill=tk.X, pady=1)
ttk.Button(sec_just_btn, text="✏️ Редактировать",
command=lambda: self._edit_sw_item(self.is_criteria_justification_listbox)).pack(fill=tk.X, pady=1)
# --- Организационные меры (словарик) ---
ttk.Label(sec_frame, text="Организационные меры:").grid(row=7, column=0, sticky=tk.W, pady=2)
self.is_org_measures_listbox = tk.Listbox(sec_frame, height=3, exportselection=False)
self.is_org_measures_listbox.grid(row=7, column=1, sticky=tk.EW, padx=(8, 4), pady=1)
sec_org_btn = ttk.Frame(sec_frame)
sec_org_btn.grid(row=7, column=2, sticky=tk.N, padx=(4, 0))
ttk.Button(sec_org_btn, text="+ Добавить",
command=lambda: self._add_sw_item(self.is_org_measures_listbox)).pack(fill=tk.X, pady=1)
ttk.Button(sec_org_btn, text="- Удалить",
command=lambda: self._del_sw_item(self.is_org_measures_listbox)).pack(fill=tk.X, pady=1)
ttk.Button(sec_org_btn, text="✏️ Редактировать",
command=lambda: self._edit_sw_item(self.is_org_measures_listbox)).pack(fill=tk.X, pady=1)
ttk.Button(sec_org_btn, text="📚 Из словаря",
command=lambda: self._select_sw_from_dict(self.is_org_measures_listbox, 'org_measures.json')).pack(fill=tk.X, pady=1)
# --- Технические меры (словарик) ---
ttk.Label(sec_frame, text="Технические меры:").grid(row=8, column=0, sticky=tk.W, pady=2)
self.is_tech_measures_listbox = tk.Listbox(sec_frame, height=3, exportselection=False)
self.is_tech_measures_listbox.grid(row=8, column=1, sticky=tk.EW, padx=(8, 4), pady=1)
sec_tech_btn = ttk.Frame(sec_frame)
sec_tech_btn.grid(row=8, column=2, sticky=tk.N, padx=(4, 0))
ttk.Button(sec_tech_btn, text="+ Добавить",
command=lambda: self._add_sw_item(self.is_tech_measures_listbox)).pack(fill=tk.X, pady=1)
ttk.Button(sec_tech_btn, text="- Удалить",
command=lambda: self._del_sw_item(self.is_tech_measures_listbox)).pack(fill=tk.X, pady=1)
ttk.Button(sec_tech_btn, text="✏️ Редактировать",
command=lambda: self._edit_sw_item(self.is_tech_measures_listbox)).pack(fill=tk.X, pady=1)
ttk.Button(sec_tech_btn, text="📚 Из словаря",
command=lambda: self._select_sw_from_dict(self.is_tech_measures_listbox, 'tech_measures.json')).pack(fill=tk.X, pady=1)
# --- Кнопка ИИ-проверки ---
ttk.Button(sec_frame, text="🤖 Проверить безопасность через ИИ",
command=self._check_security_ai).grid(
row=9, column=0, columnspan=3, sticky=tk.W, pady=(10, 0))
sec_frame.columnconfigure(1, weight=1)
# ===== Вкладка «Средства защиты» ===== # ===== Вкладка «Средства защиты» =====
def_tab = ttk.Frame(nb2) def_tab = ttk.Frame(nb2)
@@ -1800,6 +1774,132 @@ class DokoGenApp:
text="⚠ Список угроз ещё не скачан — нажмите «⬇️ Загрузить угрозы ФСТЭК»", text="⚠ Список угроз ещё не скачан — нажмите «⬇️ Загрузить угрозы ФСТЭК»",
foreground='#c62828') foreground='#c62828')
def _suggest_threats_program_click(self):
"""Подобрать угрозы логикой программы по характеристикам объекта."""
if self._current_is_idx is None:
messagebox.showinfo("Угрозы", "Сначала выберите объект КИИ в списке слева")
return
self._collect_is()
isys = self.model.information_systems[self._current_is_idx]
try:
from .threat_rules import suggest_threats_program
threats = suggest_threats_program(isys, limit=20)
except Exception as e:
messagebox.showerror("Ошибка", str(e))
return
if not threats:
messagebox.showinfo("Угрозы", "Не удалось подобрать угрозы.\n"
"Скачайте перечень ФСТЭК: кнопка «⬇️ Загрузить угрозы ФСТЭК».")
return
lb = self.is_threats_listbox
lb.delete(0, tk.END)
for t in threats:
lb.insert(tk.END, t)
self.log(f"⚙️ Угрозы подобраны программой: {len(threats)} шт.")
def _suggest_threats_ai_click(self):
"""Подобрать угрозы через ИИ по характеристикам объекта."""
if self._current_is_idx is None:
messagebox.showinfo("Угрозы", "Сначала выберите объект КИИ в списке слева")
return
settings = load_api_settings()
if not settings.get('ai_api_key'):
messagebox.showwarning("Настройки", "Не задан API-ключ ИИ.\nМеню «Файл → Настройки»")
return
self._collect_is()
isys = self.model.information_systems[self._current_is_idx]
from .threat_rules import _has_internet
data = {
'name': isys.name or '',
'description': isys.description or '',
'object_type': isys.object_type or '',
'sphere': isys.sphere or '',
'architecture': isys.architecture or '',
'net_category': isys.net_category or '',
'attacker_category': isys.attacker_category or '',
'has_internet': _has_internet(isys),
}
self.log(f"🤖 Запрос к ИИ: подбор угроз для «{isys.name}»")
self._verify_log("Подбор угроз через ИИ…")
def _run():
try:
from .verify import suggest_threats_ai
threats, err = suggest_threats_ai(
data, settings['ai_api_key'], settings.get('ai_model'), settings.get('ai_base_url'))
self.root.after(0, lambda: self._suggest_threats_ai_done(threats, err))
except Exception as e:
self.root.after(0, lambda: self._suggest_threats_ai_done(None, str(e)))
threading.Thread(target=_run, daemon=True).start()
def _suggest_threats_ai_done(self, threats, err):
if err:
self._verify_log(f"{err}")
self.log(f"❌ Подбор угроз ИИ: {err}")
return
if not threats:
self._verify_log("❌ ИИ не вернул угрозы")
return
lb = self.is_threats_listbox
lb.delete(0, tk.END)
for t in threats:
lb.insert(tk.END, t)
self.log(f"🤖 ИИ подобрал угроз: {len(threats)}")
self._verify_log(f"🤖 ИИ: {len(threats)} угроз")
def _compare_threats(self):
"""Сравнить угрозы, подобранные программой и ИИ."""
if self._current_is_idx is None:
messagebox.showinfo("Сравнение", "Сначала выберите объект КИИ в списке слева")
return
self._collect_is()
isys = self.model.information_systems[self._current_is_idx]
from .threat_rules import suggest_threats_program
program = suggest_threats_program(isys, limit=20)
current = [str(self.is_threats_listbox.get(i)) for i in range(self.is_threats_listbox.size())]
if not current:
messagebox.showinfo("Сравнение", "Сначала подберите угрозы (программой или ИИ).")
return
# Показываем окно: слева подобрано программой, справа текущий список
dlg = tk.Toplevel(self.root)
dlg.title("Сравнение угроз: программа ↔ ИИ/текущий")
dlg.geometry("760x420")
dlg.transient(self.root)
frm = ttk.Frame(dlg, padding=8)
frm.pack(fill=tk.BOTH, expand=True)
left = ttk.Frame(frm)
left.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)
ttk.Label(left, text="⚙️ Программа", font=('Arial', 9, 'bold')).pack(anchor=tk.W)
lb_p = tk.Listbox(left, height=14)
lb_p.pack(fill=tk.BOTH, expand=True, pady=4)
for t in program:
lb_p.insert(tk.END, t)
right = ttk.Frame(frm)
right.pack(side=tk.LEFT, fill=tk.BOTH, expand=True, padx=(8, 0))
ttk.Label(right, text="🤖 ИИ / текущий список", font=('Arial', 9, 'bold')).pack(anchor=tk.W)
lb_c = tk.Listbox(right, height=14)
lb_c.pack(fill=tk.BOTH, expand=True, pady=4)
for t in current:
lb_c.insert(tk.END, t)
# Подсветка совпадений
pset = set(program)
for i in range(lb_p.size()):
if lb_p.get(i) in set(current):
lb_p.itemconfig(i, bg='#c8e6c9')
for i in range(lb_c.size()):
if lb_c.get(i) in pset:
lb_c.itemconfig(i, bg='#c8e6c9')
info = ttk.Label(frm, text="Зелёным выделены совпавшие угрозы.",
foreground='gray')
info.pack(anchor=tk.W, pady=(4, 0))
def _check_security_ai(self): def _check_security_ai(self):
"""Проверка вкладки «Безопасность» через ИИ (DeepSeek/OpenAI-совместимый API).""" """Проверка вкладки «Безопасность» через ИИ (DeepSeek/OpenAI-совместимый API)."""
if self._current_is_idx is None: if self._current_is_idx is None:
@@ -1943,7 +2043,7 @@ class DokoGenApp:
"""Открывает окно с чекбоксами для выбора элементов из списка.""" """Открывает окно с чекбоксами для выбора элементов из списка."""
dialog = tk.Toplevel(self.root) dialog = tk.Toplevel(self.root)
dialog.title(title) dialog.title(title)
dialog.geometry("400x500") dialog.geometry("720x680")
dialog.transient(self.root) dialog.transient(self.root)
dialog.grab_set() dialog.grab_set()
@@ -1952,6 +2052,13 @@ class DokoGenApp:
ttk.Label(frame, text=title, font=('Arial', 10, 'bold')).pack(anchor=tk.W, pady=(0, 5)) ttk.Label(frame, text=title, font=('Arial', 10, 'bold')).pack(anchor=tk.W, pady=(0, 5))
# Поиск (важно для большого перечня угроз ФСТЭК)
search_var = tk.StringVar()
search_entry = ttk.Entry(frame, textvariable=search_var)
search_entry.pack(fill=tk.X, pady=(0, 5))
search_entry.insert(0, "")
search_entry.focus_set()
# Уже выбранные элементы # Уже выбранные элементы
existing = set(listbox.get(0, tk.END)) existing = set(listbox.get(0, tk.END))
@@ -1973,6 +2080,17 @@ class DokoGenApp:
vars[item] = var vars[item] = var
items_map[item] = (var, cb) items_map[item] = (var, cb)
# Фильтр по поиску: скрываем неподходящие чекбоксы
def _apply_search(*_):
q = search_var.get().strip().lower()
for item, (var, cb) in items_map.items():
if q and q not in item.lower():
cb.pack_forget()
else:
cb.pack(anchor=tk.W, pady=1)
search_var.trace_add('write', _apply_search)
btn_frame = ttk.Frame(dialog, padding=10) btn_frame = ttk.Frame(dialog, padding=10)
btn_frame.pack(fill=tk.X) btn_frame.pack(fill=tk.X)
+29
View File
@@ -474,6 +474,35 @@ def compare_company_values(old_data, new_data):
return diffs return diffs
def suggest_threats_ai(security_data, api_key, model='deepseek-chat', base_url=None):
"""ИИ предлагает актуальные угрозы БИ для объекта КИИ по его характеристикам.
security_data dict: name, description, object_type, sphere, architecture,
attacker_category, has_internet (True/False), etc.
Возвращает (список_угроз, ошибка).
"""
if not api_key:
return None, "Не задан API-ключ ИИ (Файл → Настройки → API)"
internet = 'да' if security_data.get('has_internet', True) else 'нет'
system = (
"Ты — эксперт ФСТЭК по безопасности критической информационной инфраструктуры "
"(187-ФЗ, приказ ФСТЭК № 236). На основе характеристик объекта КИИ составь "
"перечень АКТУАЛЬНЫХ угроз безопасности информации из БДУ ФСТЭК "
"(перечень угроз УБИ.xxx). Верни ТОЛЬКО JSON: "
'{"threats": ["УБИ.xxx Название угрозы", ...]} — от 8 до 15 угроз, '
"без пояснений и комментариев."
)
user = json.dumps(security_data, ensure_ascii=False)
js, err = _ai_json(api_key, model, base_url, system, user)
if err:
return None, err
threats = js.get('threats') or []
if isinstance(threats, str):
threats = [threats]
threats = [str(t).strip() for t in threats if str(t).strip()]
return threats, None
def check_security_ai(security_data, api_key, model='deepseek-chat', base_url=None): def check_security_ai(security_data, api_key, model='deepseek-chat', base_url=None):
"""ИИ-проверка заполненной вкладки «Безопасность» объекта КИИ (236 приказ). """ИИ-проверка заполненной вкладки «Безопасность» объекта КИИ (236 приказ).