Критические изменения в версии 1.3

27 января 2025

ID breaking_changes

В связи с изменениями в компонентах SDK в версии 1.3, вам может быть необходимо внести изменения в прикладной код, разработанный с использованием версии KasperskyOS Community Edition 1.2, перед тем как использовать его с версией KasperskyOS Community Edition 1.3.

В версии 1.3 были введены следующие критические изменения в компоненты SDK:

  • Из ядра KasperskyOS в составе SDK удалена поддержка счетчиков производительности.
  • Из SDK удалены объявления функций: fork, exec*, popen*, pclose. Использование этих функций приведет к ошибке при сборке.
  • Указание неверного имени IPC-канала в шаблоне файла init.yaml.in приводит к ошибке при сборке.
  • Тулчейн в составе SDK переведен на использование компилятора Clang.
  • В компоненте Mbed-TLS включены алгоритмы TLS 1.3. Необходимо вызывать функцию psa_crypto_init() перед первым использованием хеширующих механизмов. Для корректной работы библиотеки Mbed-TLS достаточно добавить вызов psa_crypto_init() перед первым вызовом любой функции Mbed-TLS. Эту функцию можно вызывать произвольное количество раз: если первый вызов проходит успешно, остальные вызовы также будут успешны.
  • Изменения в библиотеке kdf:
    • удалены функции KdfGetDeviceFromContainer() и KdfEnumContainerNames();
    • функции KdfGetDeviceListByTarget() и KdfGetDeviceListByTargetSet() теперь возвращают контейнер с дескриптором типа KdfDevContainerHandle.
  • Из интерфейса ядра Handle.idl удален устаревший метод SecurityDisconnect.
  • Удален конфигурационный параметр VFS_BUFFER_SPLIT_SIZE. В качестве ограничения сверху при передаче данных в арене IPC в VFS будет использоваться VFS_BUFFER_SIZE. Для конфигурирования размера I/O буфера (setbuf) вводится новый параметр VFS_BUFSIZ. Для чтения/записи данных большого размера появится возможность использовать буферы MDL.
  • В VFS добавлена поддержка прав доступа для файлов. Теперь при работе с файлами VFS будет проверять биты владельца (S_IRUSR, S_IWUSR, S_IXUSR) у файла и разрешать/запрещать те или иные операции. При создании файла и каталога нужно обязательно проверять, что все биты выставляются корректно:
    • Для файлов нужно обязательно указывать биты разрешения чтения и записи: open(file, O_RDWR | O_CREAT, (S_IRUSR | S_IWUSR)
    • Для директорий обязательно указывать все три бита (Read | Write | Execute). Бит Execute отвечает за возможность поиска файлов в директории: mkdir(dir, S_IRWXU)

    Поскольку функция open() позволяет создавать файлы не указывая данные биты, то может возникнуть ситуация, что ранее созданные файлы могут перестать открываться с ошибкой EACCESS. Изменить права у файла можно с помощью функции chmod().

  • В интерфейсе Driver.idl метод GetDeviceEvents() переименован в AwaitDeviceEvents().
  • Функция-инициализатор kl_drivers_Driver *KdfServerInit(KdfServerData *data) заменена на kl_drivers_Driver *KdfServerInit(void).
  • Интерфейс ядра Task::FreeSelfEnv стал заглушкой, которая возвращает rcUimplemented, а функции KnTaskFreeEnv и KnTaskGetEnv перестали быть потокобезопасными.
  • Запись в AF_ROUTE сокеты запрещена. Теперь при попытке записи в AF_ROUTE сокет будет возвращена ошибка EACCESS. Для добавления/удаления маршрутов необходимо использовать ioctl() и структуру ortentry.
  • Изменено поведение вызова nk_arena_get(). RTL_NULL возвращается только в случае ошибки, иначе даже в случае получения данных нулевого размера возвращается корректный указатель на память.
  • Значения IDL-типа string при передаче в IPC-сообщениях должны содержать завершающий нулевой байт, даже пустые строки. Строки из нуля байтов перестанут считаться валидными и будут отклоняться Kaspersky Security Module.
  • Изменены прототипы функций:
    • KosString KosCreateStringEx(KosStringRoot *root, const char *str) изменен на Retcode KosCreateStringEx(KosStringRoot *root, const char *str, KosString *outStr);
    • KosString KosCreateString(const char *str) изменен на Retcode KosCreateString(const char *str, KosString *outStr).
  • В интерфейс ядра task.Task добавлен новый метод GetPid, который всегда используется при создании процесса.

    В результате при строго настроенной политики безопасности с жестким ограничением методов вызов EntityInit(Ex) начнет возвращать ошибку. Необходимо в политике добавить новый метод в разрешенные.

    Пример:

    request dst=kl.core.Core {

    match endpoint=task.Task {

    match method=GetPid {

    match src=Einit { grant () }

    }

    }

    }

  • В каждый EDL-файл в составе SDK, содержащий службу kl.drivers.Block, также добавлена служба типа kl.drivers.Driver.

    Например, для ATA.edl результат будет выглядеть так:

    entity kl.drivers.ATA

    security kl.drivers.block.Security

    endpoints {

    driver : kl.drivers.Driver

    ata: kl.drivers.Block

    }

  • Переработан набор методов службы Block.idl:
    • Удален метод Fini().
    • Удален метод EnumPorts(). Следует использовать метод GetDeviceList() службы kl.drivers.Driver.
    • Удален метод Open(). Следует использовать метод OpenDevice() службы kl.drivers.Driver.
    • Удален метод Close(). Следует использовать метод CloseDevice() службы kl.drivers.Driver.
  • Добавлен список поддерживаемых кодов (MIB) функции sysctl(). Вызов с кодами, отличными от поддерживаемых запрещен и возвращает код ENOSYS. Все разрешенные коды переведены на отдельные интерфейсные методы компонента VFS (VfsNetConfig.idl). При помощи политик безопасности можно разрешать только чтение или только запись, используя аргумент valOperation IPC-запроса (кроме IpctlForwarding, RtDump, RtIflist): 0 - запись, установка значения параметра; 1 - чтение параметра; 2 - запрос размера параметра)

    Поддерживаемые коды перечислены в таблице ниже.

    Разрешенные коды функции sysctl()

Вам помогла эта статья?
Что нам нужно улучшить?
Спасибо за ваш отзыв, вы помогаете нам становиться лучше!
Спасибо за ваш отзыв, вы помогаете нам становиться лучше!