Критические изменения в версии 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). При помощи политик безопасности можно разрешать только чтение или только запись, используя аргументvalOperationIPC-запроса (кромеIpctlForwarding,RtDump,RtIflist): 0 - запись, установка значения параметра; 1 - чтение параметра; 2 - запрос размера параметра)Поддерживаемые коды перечислены в таблице ниже.
Разрешенные коды функции sysctl()
Название параметра
Код MIB
Интерфейсный метод VFS
net.inet.ip.forwardingCTL_NET, PF_INET, IPPROTO_IP, IPCTL_FORWARDINGIpctlForwardingnet.inet.ip.mtudiscCTL_NET, PF_INET, IPPROTO_IP, IPCTL_MTUDISCIpctlMtudiscnet.inet.ip.ttlCTL_NET, PF_INET, IPPROTO_IP, IPCTL_DEFTTLIpctlTtlnet.inet.tcp.keepcntCTL_NET, PF_INET, IPPROTO_TCP, TCPCTL_KEEPCNTTcpctlKeepcntnet.inet.tcp.keepidleCTL_NET, PF_INET, IPPROTO_TCP, TCPCTL_KEEPIDLETcpctlKeepidlenet.inet.tcp.keepintvlCTL_NET, PF_INET, IPPROTO_TCP, TCPCTL_KEEPINTVLTcpctlKeepintvlnet.inet.tcp.mss_ifmtuCTL_NET, PF_INET, IPPROTO_TCP, TCPCTL_MSS_IFMTUTcpctlMssifmtunet.inet.tcp.mssdfltCTL_NET, PF_INET, IPPROTO_TCP, TCPCTL_MSSDFLTTcpctlMssdfltnet.inet.tcp.recvspaceCTL_NET, PF_INET, IPPROTO_TCP, TCPCTL_RECVSPACETcpctlRecvspacenet.inet.tcp.sendspaceCTL_NET, PF_INET, IPPROTO_TCP, TCPCTL_SENDSPACETcpctlSendspacenet.inet.udp.recvspaceCTL_NET, PF_INET, IPPROTO_UDP, UDPCTL_RECVSPACEUdpctlRecvspacenet.inet.udp.sendspaceCTL_NET, PF_INET, IPPROTO_UDP, UDPCTL_SENDSPACEUdpctlSendspacenet.route.rtdumpCTL_NET, PF_ROUTE, NET_RT_DUMPRtDumpnet.route.rtiflistCTL_NET, PF_ROUTE, NET_RT_IFLISTRtIflistnet.inet.ip.dad_countCTL_NET, PF_INET, IPPROTO_IP, IPCTL_DAD_COUNTIpctlDadcountkern.hostnameCTL_KERN, KERN_HOSTNAMEKernHostname