Описание

При выполнении стороннего программного обеспечения (ПО) в среде Astra Linux Special Edition 1.7 с установленным актуальным оперативным обновлением может нарушаться работа некоторых программ. При этом может возникать ранее не наблюдавшаяся ошибка "Недостаточно прав" ("Permission denied"), например "cannot enable executable stack as shared object requires: Permission denied". Данная ошибка может быть вызвана попыткой ПО разрешить исполнение кода, находящегося в программном стеке. Исполнение такого кода допустимо на некоторых аппаратных платформах, но может представлять угрозу для безопасности, поэтому по умолчанию запрещено.

Диагностика

При включенном запрете исполнения кода в стеке попытки разрешения такого исполнения регистрируются в журнале аудита. Проверить наличие записей о таких попытках можно командой:

sudo /usr/sbin/ausearch -m AVC | grep mprotect

Пример вывода команды:

type=AVC msg=audit(1734413451.012:20444): parsec=denied fn=parsec_file_mprotect requested=x pid=9108 comm="a.out"


Рекомендации

  1. По возможности исключить использование ПО, генерирующего указанную выше ошибку, как потенциально небезопасного.
  2. Обратиться к разработчикам ПО для его доработки с целью устранения потенциально небезопасных действий ПО и использовать только доработанное ПО.
  3. При невозможности выполнения предыдущих рекомендаций в сочетании с необходимостью эксплуатировать имеющееся ПО — отключить контроль разрешения исполнения кода в программном стеке:

    Описанное ниже изменение в настройке операционной системы ведет к снижению её защищенности. Применяя это изменение вы принимаете на себя ответственность за возможные последствия.

    Для отключения контроля:

    • добавить параметр ядра parsec.execstack со значением 1 в строку значений параметра GRUB_CMDLINE_LINUX_DEFAULT в конфигурационном файле /etc/default/grub. Пример результирующей строки:
      GRUB_CMDLINE_LINUX_DEFAULT="parsec.mac=0 quiet net.ifnames=0 parsec.execstack=1"
    • обновить конфигурацию загрузчика:
      sudo update-grub
    • перезагрузить компьютер.

    Для обратного включения контроля после обновления ПО:

    • убрать параметр ядра parsec.execstack из строки значений параметра GRUB_CMDLINE_LINUX_DEFAULT или заменить его значение на 0 в конфигурационном файле /etc/default/grub. Пример результирующей строки:
      GRUB_CMDLINE_LINUX_DEFAULT="parsec.mac=0 quiet net.ifnames=0 parsec.execstack=0"
    • обновить конфигурацию загрузчика:
      sudo update-grub
    • перезагрузить компьютер.

Рекомендации для разработчиков

  1. При сборке ПО не использовать параметр компиляции -z execstack. Этот параметр, передаваемый компоновщику. означает, что инструкции, расположенные в стеке, могут быть выполнены.
  2. Ошибка "Permission denied" возникает при попытке установки флага разрешения исполнения на область памяти, т.е. при попытке исполнения системного вызова mprotect(). Для предотвращения возникновения ошибки следует исключить такие вызовы. Для выявления попыток установки флага исполнения (выявления обращений к системному вызову mprotect()) в ходе исполнения программы использовать инструмент strace.