openharmony 鸿蒙 guidance-on-ndk-libc-interfaces-affected-by-permissions

2025-06-16 浏览 (1)

NDK涉及的musl libc接口使用限制的说明

概述

开发者使用DevEco Studio或者NDK进行应用开发时,可能涉及到使用musl libc的接口能力,因为musl libc的个别接口可能受多种系统和环境的限制而无法使用,此时可以通过本文档进行接口问题排查。

Seccomp机制影响的musl接口

Seccomp机制可参考Seccomp策略使能开发指导

确定进程因为Seccomp机制终止的方法

  • 查看进程faultlog日志,如果报错原因是signal:SIGSYS,且栈顶在ld-musl-{架构}.so.1库里,则进程终止可能是由Seccomp机制引起的。
    cat /data/log/faultlog/faultlogger/cppcrash-xxxx
    
    错误示例:
    Process name:com.example.myapplication
    Reason:Signal:SIGSYS(UNKNOWN)
    Fault thread Info:
    Tid:13893, Name:e.myapplication
    #00 pc 000a5d30 /system/lib/ld-musl-arm.so.1(sethostname+16)(584c9d0a0e9000497bb0d66799a9526a)
    #01 pc 00002f68 /data/storage/el1/bundle/libs/arm/libentry.so(test()+64)
    
  • 关闭Seccomp机制,如果进程能正常运行,则进程终止是由Seccomp机制引起的。

    当设备系统版本是ENG版本,且处于root模式下,执行shell命令设置系统参数,关闭整个系统的Seccomp机制。

    # 设置相关系统参数关闭Seccomp机制后重启
    param set persist.init.debug.seccomp.enable 0
    reboot
    # 设置相关系统参数开启Seccomp机制后重启
    param set persist.init.debug.seccomp.enable 1
    reboot
    

常见可能受Seccomp机制影响的接口列表如下

头文件musl接口名称
fcntl.hname_to_handle_at
fcntl.hopen_by_handle_at
grp.hinitgroups
grp.hsetgroups
sched.hsetns
sched.hunshare
sys/fanotify.hfanotify_init
sys/fanotify.hfanotify_mark
sys/fsuid.hsetfsgid
sys/fsuid.hsetfsuid
sys/klog.hklogctl
sys/mount.hmount
sys/mount.humount2
sys/mount.humount
sys/msg.hmsgctl
sys/msg.hmsgget
sys/msg.hmsgrcv
sys/msg.hmsgsnd
sys/reboot.hreboot
sys/sem.hsemctl
sys/sem.hsemget
sys/sem.hsemop
sys/sem.hsemtimedop
sys/shm.hshmat
sys/shm.hshmctl
sys/shm.hshmdt
sys/shm.hshmget
sys/stat.hmkfifo
sys/stat.hmkfifoat
sys/stat.hmknod
sys/stat.hmknodat
sys/swap.hswapoff
sys/swap.hswapon
time.hclock_settime
sys/time.hsettimeofday
sys/timex.hadjtimex
sys/timex.hclock_adjtime
unistd.hacct
unistd.hchroot
unistd.hpause
unistd.hsetdomainname
unistd.hsetegid
unistd.hsetgid
unistd.hsethostname
unistd.hsetregid
unistd.hsetresgid
unistd.hsetreuid
unistd.hsetuid
Nonepivot_root
Noneinit_module
Nonedelete_module

内核没有对外开放影响的musl接口

头文件musl接口名称
sys/fanotify.hfanotify_init
sys/fanotify.hfanotify_mark
unistd.hacct

SELinux机制影响的musl接口

SELinux的说明可参考OpenHarmony SELinux概述

确定接口因为SELinux机制报错的方法

  • 引入errno.h头文件,检查errno错误状态码,如果错误状态码是EACCES,则接口报错可能是由SELinux机制引起的。
  • 检查内核avc日志,排查type=1400的SELinux拦截日志,判断接口报错是否由SELinux机制引起的。

    # 搜索type=1400的内核Selinux日志(注意:因为执行效率的原因,内核会舍弃部分日志)
    dmesg -w|grep "pid=2854"|grep "type=1400"
    # 受SELinux机制影响的日志示例
    audit: type=1400 audit(1502785908.269:47562): avc:  denied  { ioctl } for  pid=2854 comm="sh" path="/dev/tty" dev="tmpfs" ino=40 ioctlcmd=0x5403 scontext=u:r:su:s0 tcontext=u:object_r:tty_device:s0 tclass=chr_file permissive=0
    # 日志解读
    ioctl                               # 访问客体的操作权限
    pid=2854                            # 主体进程号
    comm="sh"                           # 主体进程名
    path="/dev/tty"                     # 被访问的客体
    dev="tmpfs"                         # 被访问客体的文件系统
    ino=40                              # 文件节点编号
    ioctlcmd=0x5403                     # ioctl操作命令
    scontext=u:r:su:s0                  # 主体SELinux标签
    tcontext=u:object_r:tty_device:s0   # 客体SELinux标签
    tclass=chr_file                     # 权限类别,字符设备文件
    permissive=0                        # 0是严格模式,拦截访问;1是宽容模式,只记录日志
    # 日志结论
    主体进程(2854)访问客体(/dev/tty),调用客体的ioctl操作,因为进程缺少ioctlcmd=0x5403命令的执行权限,且由于当前SELinux机制处于严格模式下,所以内核拦截了进程操作,并且将errno设置成EACCES错误。
    
  • 关闭SELinux机制,如果接口调用成功,则接口报错是由SELinux机制引起的。

    当设备处于root模式下,执行shell命令设置系统参数,临时关闭整个系统的SELinux机制。

    # 设置相关系统参数关闭SELinux机制
    setenforce 0
    # 设置相关系统参数开启SELinux机制
    setenforce 1
    

常见可能受SELinux机制影响的接口列表如下

头文件musl接口名称
net/if.hif_indextoname
net/if.hif_nametoindex
pty.hforkpty
pty.hopenpty
semaphore.hsem_open
semaphore.hsem_unlink
stdlib.hptsname
stdlib.hptsname_r
stdlib.hposix_openpt
stdlib.hunlockpt
stdio.hpopen
stdio.hpclose
sys/ioctl.hioctl
sys/mman.hshm_open
sys/mman.hshm_unlink
sys/mount.hmount
sys/mount.humount
sys/mount.humount2
sys/msg.hmsgctl
sys/msg.hmsgget
sys/msg.hmsgrcv
sys/msg.hmsgsnd
sys/sem.hsemget
sys/sem.hsemctl
sys/sem.hsemop
sys/sem.hsemtimedop
sys/shm.hshmget
sys/shm.hshmat
sys/shm.hshmdt
sys/shm.hshmctl
sys/stat.hmkfifo
sys/stat.hmkfifoat
sys/stat.hmknod
sys/stat.hmknodat
termios.htcgetattr
termios.htcsetattr
termios.htcsendbreak
termios.htcdrain
termios.htcflush
termios.htcflow
termios.htcgetsid
unistd.hlink
unistd.hlinkat
unistd.hreadlink
unistd.hreadlinkat
unistd.hsymlink
unistd.hsymlinkat
unistd.htcgetpgrp
unistd.htcsetpgrp
utmp.hlogin_tty

沙箱机制影响的musl接口

沙箱机制可参考 应用沙箱目录

引入errno.h头文件,检查errno错误状态码,如果错误状态码是ENOENT,则接口报错可能是由沙箱机制引起的。

常见可能受沙箱机制影响的接口列表如下:

头文件musl接口名称
fcntl.hopen
fcntl.hopenat
nl_types.hcatopen
stdio.hfopen
stdio.hfreopen
stdio.hrename
stdio.hrenameat
stdio.hrenameat2
stdio.htmpfile
stdio.htmpfile64

空实现或默认失败的musl接口

头文件musl接口名称
netdb.hgetnetbyaddr
netdb.hgetnetbyname
stdio_ext.h__fsetlocking
unistd.hbrk
utmp.hgetutent
utmp.hpututline
utmp.hsetutent
utmp.hpututline
utmp.hutmpname

需要特殊权限才能执行的musl接口

引入errno.h头文件,检查errno错误状态码,如果错误状态码是EPERM,则接口报错可能是由系统Capabilities安全机制引起的,也有可能是内核其他安全管控引起的。

常见可能受Capabilities机制影响的接口如下:

头文件musl接口名称Capabilities权限
Nonepivot_rootCAP_SYS_ADMIN
Noneinit_moduleCAP_SYS_MODULE
Nonedelete_moduleCAP_SYS_MODULE
fcntl.hopen_by_handle_atCAP_DAC_READ_SEARCH
sys/klog.hklogctlCAP_SYS_ADMIN
sys/mount.hmountCAP_SYS_ADMIN
sys/mount.humountCAP_SYS_ADMIN
sys/mount.humount2CAP_SYS_ADMIN
sys/reboot.hrebootCAP_SYS_BOOT
sys/swap.hswaponCAP_SYS_ADMIN
sys/swap.hswapoffCAP_SYS_ADMIN
sys/time.hsettimeofdayCAP_SYS_TIME
unistd.hsetdomainnameCAP_SYS_ADMIN
unistd.hsethostnameCAP_SYS_ADMIN
unistd.hchrootCAP_SYS_CHROOT

你可能感兴趣的鸿蒙文章

harmony 鸿蒙Native API标准库

harmony 鸿蒙VkExternalFormatOHOS

harmony 鸿蒙VkImportNativeBufferInfoOHOS

harmony 鸿蒙VkMemoryGetNativeBufferInfoOHOS

harmony 鸿蒙VkNativeBufferFormatPropertiesOHOS

harmony 鸿蒙VkNativeBufferPropertiesOHOS

harmony 鸿蒙VkNativeBufferUsageOHOS

harmony 鸿蒙VkSurfaceCreateInfoOHOS

harmony 鸿蒙Vulkan模块

harmony 鸿蒙标准C++库

  • 所属分类: 后端技术
  • 本文标签: 软件 鸿蒙
  • 版权声明: 本文链接 https://seaxiang.com/blog/ugKTXR