KasperskyOS Community Edition 1.3

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

В связи с изменениями в компонентах 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()

    Название параметра

    Код MIB

    Интерфейсный метод VFS

    net.inet.ip.forwarding

    CTL_NET, PF_INET, IPPROTO_IP, IPCTL_FORWARDING

    IpctlForwarding

    net.inet.ip.mtudisc

    CTL_NET, PF_INET, IPPROTO_IP, IPCTL_MTUDISC

    IpctlMtudisc

    net.inet.ip.ttl

    CTL_NET, PF_INET, IPPROTO_IP, IPCTL_DEFTTL

    IpctlTtl

    net.inet.tcp.keepcnt

    CTL_NET, PF_INET, IPPROTO_TCP, TCPCTL_KEEPCNT

    TcpctlKeepcnt

    net.inet.tcp.keepidle

    CTL_NET, PF_INET, IPPROTO_TCP, TCPCTL_KEEPIDLE

    TcpctlKeepidle

    net.inet.tcp.keepintvl

    CTL_NET, PF_INET, IPPROTO_TCP, TCPCTL_KEEPINTVL

    TcpctlKeepintvl

    net.inet.tcp.mss_ifmtu

    CTL_NET, PF_INET, IPPROTO_TCP, TCPCTL_MSS_IFMTU

    TcpctlMssifmtu

    net.inet.tcp.mssdflt

    CTL_NET, PF_INET, IPPROTO_TCP, TCPCTL_MSSDFLT

    TcpctlMssdflt

    net.inet.tcp.recvspace

    CTL_NET, PF_INET, IPPROTO_TCP, TCPCTL_RECVSPACE

    TcpctlRecvspace

    net.inet.tcp.sendspace

    CTL_NET, PF_INET, IPPROTO_TCP, TCPCTL_SENDSPACE

    TcpctlSendspace

    net.inet.udp.recvspace

    CTL_NET, PF_INET, IPPROTO_UDP, UDPCTL_RECVSPACE

    UdpctlRecvspace

    net.inet.udp.sendspace

    CTL_NET, PF_INET, IPPROTO_UDP, UDPCTL_SENDSPACE

    UdpctlSendspace

    net.route.rtdump

    CTL_NET, PF_ROUTE, NET_RT_DUMP

    RtDump

    net.route.rtiflist

    CTL_NET, PF_ROUTE, NET_RT_IFLIST

    RtIflist

    net.inet.ip.dad_count

    CTL_NET, PF_INET, IPPROTO_IP, IPCTL_DAD_COUNT

    IpctlDadcount

    kern.hostname

    CTL_KERN, KERN_HOSTNAME

    KernHostname