Skip to content

Can not use the device created by System call interception #3014

@everzakov

Description

@everzakov

Is there an existing issue for this?

  • There is no existing issue for this bug

Is this happening on an up to date version of Incus?

  • This is happening on a supported version of Incus

Incus system details

vboxuser@vboxuser:~/incus$ incus info
config: {}
api_extensions:
- storage_zfs_remove_snapshots
- container_host_shutdown_timeout
- container_stop_priority
- container_syscall_filtering
- auth_pki
- container_last_used_at
- etag
- patch
- usb_devices
- https_allowed_credentials
- image_compression_algorithm
- directory_manipulation
- container_cpu_time
- storage_zfs_use_refquota
- storage_lvm_mount_options
- network
- profile_usedby
- container_push
- container_exec_recording
- certificate_update
- container_exec_signal_handling
- gpu_devices
- container_image_properties
- migration_progress
- id_map
- network_firewall_filtering
- network_routes
- storage
- file_delete
- file_append
- network_dhcp_expiry
- storage_lvm_vg_rename
- storage_lvm_thinpool_rename
- network_vlan
- image_create_aliases
- container_stateless_copy
- container_only_migration
- storage_zfs_clone_copy
- unix_device_rename
- storage_lvm_use_thinpool
- storage_rsync_bwlimit
- network_vxlan_interface
- storage_btrfs_mount_options
- entity_description
- image_force_refresh
- storage_lvm_lv_resizing
- id_map_base
- file_symlinks
- container_push_target
- network_vlan_physical
- storage_images_delete
- container_edit_metadata
- container_snapshot_stateful_migration
- storage_driver_ceph
- storage_ceph_user_name
- resource_limits
- storage_volatile_initial_source
- storage_ceph_force_osd_reuse
- storage_block_filesystem_btrfs
- resources
- kernel_limits
- storage_api_volume_rename
- network_sriov
- console
- restrict_dev_incus
- migration_pre_copy
- infiniband
- dev_incus_events
- proxy
- network_dhcp_gateway
- file_get_symlink
- network_leases
- unix_device_hotplug
- storage_api_local_volume_handling
- operation_description
- clustering
- event_lifecycle
- storage_api_remote_volume_handling
- nvidia_runtime
- container_mount_propagation
- container_backup
- dev_incus_images
- container_local_cross_pool_handling
- proxy_unix
- proxy_udp
- clustering_join
- proxy_tcp_udp_multi_port_handling
- network_state
- proxy_unix_dac_properties
- container_protection_delete
- unix_priv_drop
- pprof_http
- proxy_haproxy_protocol
- network_hwaddr
- proxy_nat
- network_nat_order
- container_full
- backup_compression
- nvidia_runtime_config
- storage_api_volume_snapshots
- storage_unmapped
- projects
- network_vxlan_ttl
- container_incremental_copy
- usb_optional_vendorid
- snapshot_scheduling
- snapshot_schedule_aliases
- container_copy_project
- clustering_server_address
- clustering_image_replication
- container_protection_shift
- snapshot_expiry
- container_backup_override_pool
- snapshot_expiry_creation
- network_leases_location
- resources_cpu_socket
- resources_gpu
- resources_numa
- kernel_features
- id_map_current
- event_location
- storage_api_remote_volume_snapshots
- network_nat_address
- container_nic_routes
- cluster_internal_copy
- seccomp_notify
- lxc_features
- container_nic_ipvlan
- network_vlan_sriov
- storage_cephfs
- container_nic_ipfilter
- resources_v2
- container_exec_user_group_cwd
- container_syscall_intercept
- container_disk_shift
- storage_shifted
- resources_infiniband
- daemon_storage
- instances
- image_types
- resources_disk_sata
- clustering_roles
- images_expiry
- resources_network_firmware
- backup_compression_algorithm
- ceph_data_pool_name
- container_syscall_intercept_mount
- compression_squashfs
- container_raw_mount
- container_nic_routed
- container_syscall_intercept_mount_fuse
- container_disk_ceph
- virtual-machines
- image_profiles
- clustering_architecture
- resources_disk_id
- storage_lvm_stripes
- vm_boot_priority
- unix_hotplug_devices
- api_filtering
- instance_nic_network
- clustering_sizing
- firewall_driver
- projects_limits
- container_syscall_intercept_hugetlbfs
- limits_hugepages
- container_nic_routed_gateway
- projects_restrictions
- custom_volume_snapshot_expiry
- volume_snapshot_scheduling
- trust_ca_certificates
- snapshot_disk_usage
- clustering_edit_roles
- container_nic_routed_host_address
- container_nic_ipvlan_gateway
- resources_usb_pci
- resources_cpu_threads_numa
- resources_cpu_core_die
- api_os
- container_nic_routed_host_table
- container_nic_ipvlan_host_table
- container_nic_ipvlan_mode
- resources_system
- images_push_relay
- network_dns_search
- container_nic_routed_limits
- instance_nic_bridged_vlan
- network_state_bond_bridge
- usedby_consistency
- custom_block_volumes
- clustering_failure_domains
- resources_gpu_mdev
- console_vga_type
- projects_limits_disk
- network_type_macvlan
- network_type_sriov
- container_syscall_intercept_bpf_devices
- network_type_ovn
- projects_networks
- projects_networks_restricted_uplinks
- custom_volume_backup
- backup_override_name
- storage_rsync_compression
- network_type_physical
- network_ovn_external_subnets
- network_ovn_nat
- network_ovn_external_routes_remove
- tpm_device_type
- storage_zfs_clone_copy_rebase
- gpu_mdev
- resources_pci_iommu
- resources_network_usb
- resources_disk_address
- network_physical_ovn_ingress_mode
- network_ovn_dhcp
- network_physical_routes_anycast
- projects_limits_instances
- network_state_vlan
- instance_nic_bridged_port_isolation
- instance_bulk_state_change
- network_gvrp
- instance_pool_move
- gpu_sriov
- pci_device_type
- storage_volume_state
- network_acl
- migration_stateful
- disk_state_quota
- storage_ceph_features
- projects_compression
- projects_images_remote_cache_expiry
- certificate_project
- network_ovn_acl
- projects_images_auto_update
- projects_restricted_cluster_target
- images_default_architecture
- network_ovn_acl_defaults
- gpu_mig
- project_usage
- network_bridge_acl
- warnings
- projects_restricted_backups_and_snapshots
- clustering_join_token
- clustering_description
- server_trusted_proxy
- clustering_update_cert
- storage_api_project
- server_instance_driver_operational
- server_supported_storage_drivers
- event_lifecycle_requestor_address
- resources_gpu_usb
- clustering_evacuation
- network_ovn_nat_address
- network_bgp
- network_forward
- custom_volume_refresh
- network_counters_errors_dropped
- metrics
- image_source_project
- clustering_config
- network_peer
- linux_sysctl
- network_dns
- ovn_nic_acceleration
- certificate_self_renewal
- instance_project_move
- storage_volume_project_move
- cloud_init
- network_dns_nat
- database_leader
- instance_all_projects
- clustering_groups
- ceph_rbd_du
- instance_get_full
- qemu_metrics
- gpu_mig_uuid
- event_project
- clustering_evacuation_live
- instance_allow_inconsistent_copy
- network_state_ovn
- storage_volume_api_filtering
- image_restrictions
- storage_zfs_export
- network_dns_records
- storage_zfs_reserve_space
- network_acl_log
- storage_zfs_blocksize
- metrics_cpu_seconds
- instance_snapshot_never
- certificate_token
- instance_nic_routed_neighbor_probe
- event_hub
- agent_nic_config
- projects_restricted_intercept
- metrics_authentication
- images_target_project
- images_all_projects
- cluster_migration_inconsistent_copy
- cluster_ovn_chassis
- container_syscall_intercept_sched_setscheduler
- storage_lvm_thinpool_metadata_size
- storage_volume_state_total
- instance_file_head
- instances_nic_host_name
- image_copy_profile
- container_syscall_intercept_sysinfo
- clustering_evacuation_mode
- resources_pci_vpd
- qemu_raw_conf
- storage_cephfs_fscache
- network_load_balancer
- vsock_api
- instance_ready_state
- network_bgp_holdtime
- storage_volumes_all_projects
- metrics_memory_oom_total
- storage_buckets
- storage_buckets_create_credentials
- metrics_cpu_effective_total
- projects_networks_restricted_access
- storage_buckets_local
- loki
- acme
- internal_metrics
- cluster_join_token_expiry
- remote_token_expiry
- init_preseed
- storage_volumes_created_at
- cpu_hotplug
- projects_networks_zones
- network_txqueuelen
- cluster_member_state
- instances_placement_scriptlet
- storage_pool_source_wipe
- zfs_block_mode
- instance_generation_id
- disk_io_cache
- amd_sev
- storage_pool_loop_resize
- migration_vm_live
- ovn_nic_nesting
- oidc
- network_ovn_l3only
- ovn_nic_acceleration_vdpa
- cluster_healing
- instances_state_total
- auth_user
- security_csm
- instances_rebuild
- numa_cpu_placement
- custom_volume_iso
- network_allocations
- zfs_delegate
- storage_api_remote_volume_snapshot_copy
- operations_get_query_all_projects
- metadata_configuration
- syslog_socket
- event_lifecycle_name_and_project
- instances_nic_limits_priority
- disk_initial_volume_configuration
- operation_wait
- image_restriction_privileged
- cluster_internal_custom_volume_copy
- disk_io_bus
- storage_cephfs_create_missing
- instance_move_config
- ovn_ssl_config
- certificate_description
- disk_io_bus_virtio_blk
- loki_config_instance
- instance_create_start
- clustering_evacuation_stop_options
- boot_host_shutdown_action
- agent_config_drive
- network_state_ovn_lr
- image_template_permissions
- storage_bucket_backup
- storage_lvm_cluster
- shared_custom_block_volumes
- auth_tls_jwt
- oidc_claim
- device_usb_serial
- numa_cpu_balanced
- image_restriction_nesting
- network_integrations
- instance_memory_swap_bytes
- network_bridge_external_create
- network_zones_all_projects
- storage_zfs_vdev
- container_migration_stateful
- profiles_all_projects
- instances_scriptlet_get_instances
- instances_scriptlet_get_cluster_members
- instances_scriptlet_get_project
- network_acl_stateless
- instance_state_started_at
- networks_all_projects
- network_acls_all_projects
- storage_buckets_all_projects
- resources_load
- instance_access
- project_access
- projects_force_delete
- resources_cpu_flags
- disk_io_bus_cache_filesystem
- instance_oci
- clustering_groups_config
- instances_lxcfs_per_instance
- clustering_groups_vm_cpu_definition
- disk_volume_subpath
- projects_limits_disk_pool
- network_ovn_isolated
- qemu_raw_qmp
- network_load_balancer_health_check
- oidc_scopes
- network_integrations_peer_name
- qemu_scriptlet
- instance_auto_restart
- storage_lvm_metadatasize
- ovn_nic_promiscuous
- ovn_nic_ip_address_none
- instances_state_os_info
- network_load_balancer_state
- instance_nic_macvlan_mode
- storage_lvm_cluster_create
- network_ovn_external_interfaces
- instances_scriptlet_get_instances_count
- cluster_rebalance
- custom_volume_refresh_exclude_older_snapshots
- storage_initial_owner
- storage_live_migration
- instance_console_screenshot
- image_import_alias
- authorization_scriptlet
- console_force
- network_ovn_state_addresses
- network_bridge_acl_devices
- instance_debug_memory
- init_preseed_storage_volumes
- init_preseed_profile_project
- instance_nic_routed_host_address
- instance_smbios11
- api_filtering_extended
- acme_dns01
- security_iommu
- network_ipv4_dhcp_routes
- network_state_ovn_ls
- network_dns_nameservers
- acme_http01_port
- network_ovn_ipv4_dhcp_expiry
- instance_state_cpu_time
- network_io_bus
- disk_io_bus_usb
- storage_driver_linstor
- instance_oci_entrypoint
- network_address_set
- server_logging
- network_forward_snat
- memory_hotplug
- instance_nic_routed_host_tables
- instance_publish_split
- init_preseed_certificates
- custom_volume_sftp
- network_ovn_external_nic_address
- network_physical_gateway_hwaddr
- backup_s3_upload
- snapshot_manual_expiry
- resources_cpu_address_sizes
- disk_attached
- limits_memory_hotplug
- disk_wwn
- server_logging_webhook
- storage_driver_truenas
- container_disk_tmpfs
- instance_limits_oom
- backup_override_config
- network_ovn_tunnels
- init_preseed_cluster_groups
- usb_attached
- backup_iso
- instance_systemd_credentials
- cluster_group_usedby
- bpf_token_delegation
- file_storage_volume
- network_hwaddr_pattern
- storage_volume_full
- storage_bucket_full
- device_pci_firmware
- resources_serial
- ovn_nic_limits
- storage_lvmcluster_qcow2
- oidc_allowed_subnets
- file_delete_force
- nic_sriov_select_ext
- network_zones_dns_contact
- nic_attached_connected
- nic_sriov_security_trusted
- direct_backup
- instance_snapshot_disk_only_restore
- unix_hotplug_pci
- cluster_evacuating_restoring
- projects_restricted_image_servers
- storage_lvmcluster_size
- authorization_scriptlet_cert
- lvmcluster_remove_snapshots
- daemon_storage_logs
- instances_debug_repair
api_status: stable
api_version: "1.0"
auth: trusted
public: false
auth_methods:
- tls
auth_user_name: vboxuser
auth_user_method: unix
environment:
  addresses: []
  architectures:
  - x86_64
  - i686
  driver: lxc
  driver_version: 5.0.3
  firewall: nftables
  kernel: Linux
  kernel_architecture: x86_64
  kernel_features:
    idmapped_mounts: "true"
    netnsid_getifaddrs: "true"
    seccomp_listener: "true"
    seccomp_listener_continue: "true"
    uevent_injection: "true"
    unpriv_binfmt: "true"
    unpriv_fscaps: "true"
  kernel_version: 6.8.0-101-generic
  lxc_features:
    cgroup2: "true"
    core_scheduling: "true"
    devpts_fd: "true"
    idmapped_mounts_v2: "true"
    mount_injection_file: "true"
    network_gateway_device_route: "true"
    network_ipvlan: "true"
    network_l2proxy: "true"
    network_phys_macvlan_mtu: "true"
    network_veth_router: "true"
    pidfd: "true"
    seccomp_allow_deny_syntax: "true"
    seccomp_notify: "true"
    seccomp_proxy_send_notify_fd: "true"
  os_name: Ubuntu
  os_version: "24.04"
  project: default
  server: incus
  server_clustered: false
  server_event_mode: full-mesh
  server_name: vboxuser
  server_pid: 47465
  server_version: "6.22"
  storage: dir
  storage_version: "1"
  storage_supported_drivers:
  - name: btrfs
    version: 6.6.3
    remote: false
  - name: cephobject
    version: 19.2.3
    remote: true
  - name: dir
    version: "1"
    remote: false
  - name: zfs
    version: 2.2.2-0ubuntu9.4
    remote: false
  - name: ceph
    version: 19.2.3
    remote: true
  - name: cephfs
    version: 19.2.3
    remote: true
  - name: lvm
    version: 2.03.16(2) (2022-05-18) / 1.02.185 (2022-05-18) / 4.48.0
    remote: false

Instance details

vboxuser@vboxuser:~/incus$ incus config show c1
architecture: x86_64
config:
  image.architecture: amd64
  image.description: Debian bookworm amd64 (20260307_05:24)
  image.os: Debian
  image.release: bookworm
  image.serial: "20260307_05:24"
  image.type: squashfs
  image.variant: default
  limits.memory: 123MiB
  security.syscalls.intercept.mknod: "true"
  volatile.base_image: eba3a59a15af75f9f57a629bc8c976c26d44790c71f52efcda55f15dc370942d
  volatile.cloud-init.instance-id: 79437c59-a238-448d-9774-e61d31853b0a
  volatile.eth0.host_name: vethd1a6c69c
  volatile.eth0.hwaddr: 10:66:6a:bf:32:38
  volatile.idmap.base: "0"
  volatile.idmap.current: '[{"Isuid":true,"Isgid":false,"Hostid":1000000,"Nsid":0,"Maprange":1000000000},{"Isuid":false,"Isgid":true,"Hostid":1000000,"Nsid":0,"Maprange":1000000000}]'
  volatile.idmap.next: '[{"Isuid":true,"Isgid":false,"Hostid":1000000,"Nsid":0,"Maprange":1000000000},{"Isuid":false,"Isgid":true,"Hostid":1000000,"Nsid":0,"Maprange":1000000000}]'
  volatile.last_state.idmap: '[]'
  volatile.last_state.power: RUNNING
  volatile.uuid: 6f017ce8-edb7-4209-bac3-4642e3cd4ec8
  volatile.uuid.generation: 6f017ce8-edb7-4209-bac3-4642e3cd4ec8
devices: {}
ephemeral: false
profiles:
- default
stateful: false
description: ""

Instance log

vboxuser@vboxuser:~/incus$ incus info --show-log  c1
Name: c1
Description: 
Status: RUNNING
Type: container
Architecture: x86_64
PID: 48302
Created: 2026/03/07 15:43 UTC
Last Used: 2026/03/07 15:44 UTC
Started: 2026/03/07 15:44 UTC

Resources:
  Processes: 11
  CPU usage:
    CPU usage (in seconds): 2
  Memory usage:
    Memory (current): 21.00MiB
  Network usage:
    eth0:
      Type: broadcast
      State: UP
      Host interface: vethd1a6c69c
      MAC address: 10:66:6a:bf:32:38
      MTU: 1500
      Bytes received: 3.37kB
      Bytes sent: 3.87kB
      Packets received: 23
      Packets sent: 38
      IP addresses:
        inet:  10.44.17.151/24 (global)
        inet6: fd42:9edf:3eb1:f72d:1266:6aff:febf:3238/64 (global)
        inet6: fe80::1266:6aff:febf:3238/64 (link)
    lo:
      Type: loopback
      State: UP
      MTU: 65536
      Bytes received: 0B
      Bytes sent: 0B
      Packets received: 0
      Packets sent: 0
      IP addresses:
        inet:  127.0.0.1/8 (local)
        inet6: ::1/128 (local)

Log:

Current behavior

I have tried to use incus to create simple container and call mknod to create another urandom device. The device has been created and mapped to the container user namespace.
However, i can not open it. If i understand correctly, the problem is that /dev is mounted in the non initial user namespace that's why SB_I_NODEV is set to super block https://elixir.bootlin.com/linux/v6.17.9/source/fs/super.c#L358 . And open syscall is failed with EACCESS error at this check https://elixir.bootlin.com/linux/v6.17.9/source/fs/namei.c#L3441 .

Bpftrace script to check that mount_sb has SB_I_NODEV flags.

#include <uapi/linux/stat.h>
#include <linux/fs.h>
#include <linux/mount.h>

kfunc:vmlinux:may_open /comm == "head"/ { 
        $dentry = args.path->dentry;
        $inode = $dentry->d_inode;
        $i_mode = $inode->i_mode & S_IFMT;
        $mnt = args.path->mnt;
        $mnt_flags = $mnt->mnt_flags & MNT_NODEV;
        $s_iflags = $mnt->mnt_sb->s_iflags & SB_I_NODEV;
        printf("may_open is called %s path %s inode mode %d mnt_flags %d s_iflags %d\n", comm, str($dentry->d_name.name), $i_mode, $mnt_flags, $s_iflags);
}

kretfunc:vmlinux:may_open /comm == "head"/ {
        printf("may_open is returned %s %d\n", comm, retval);
}

# head -n 1 /dev/another
may_open is called head path another inode mode 8192 mnt_flags 0 s_iflags 4
may_open is returned head -13

#head -n 1 /root/another
may_open is called head path another inode mode 8192 mnt_flags 0 s_iflags 0
may_open is returned head 0

Expected behavior

I can use the device created by System call interception in the /dev directory.

Steps to reproduce

vboxuser@vboxuser:~/incus$ incus admin init --minimal
vboxuser@vboxuser:~/incus$ incus  init images:debian/12 c1
Creating c1
vboxuser@vboxuser:~/incus$ incus   config set  c1 security.syscalls.intercept.mknod=true
vboxuser@vboxuser:~/incus$ incus  config set c1 limits.memory=123MiB
vboxuser@vboxuser:~/incus$ incus   start c1
vboxuser@vboxuser:~/incus$ incus   exec c1 -- bash
root@c1:~# ls -la /dev
total 12
drwxr-xr-x  9 root   root         540 Mar  7 15:44 .
drwxr-xr-x 17 root   root        4096 Mar  7 05:31 ..
drwx--x--x  2 nobody nogroup       40 Mar  7 15:44 .incus-mounts
d--x------  2 root   root        4096 Mar  7 15:44 .incus-systemd-credentials
-r--r--r--  1 root   root          37 Mar  7 15:44 .lxc-boot-id
crwx------  1 root   tty     136,   0 Mar  7 15:44 console
lrwxrwxrwx  1 root   root          11 Mar  7 15:44 core -> /proc/kcore
lrwxrwxrwx  1 root   root          13 Mar  7 15:44 fd -> /proc/self/fd
crw-rw-rw-  1 nobody nogroup   1,   7 Mar  7 14:03 full
crw-rw-rw-  1 nobody nogroup  10, 229 Mar  7 15:44 fuse
drwxr-xr-x  2 nobody nogroup       60 Mar  7 15:41 incus
lrwxrwxrwx  1 root   root          12 Mar  7 15:44 initctl -> /run/initctl
lrwxrwxrwx  1 root   root          28 Mar  7 15:44 log -> /run/systemd/journal/dev-log
drwxrwxrwt  2 nobody nogroup       40 Mar  7 14:03 mqueue
drwxr-xr-x  2 root   root          60 Mar  7 15:44 net
crw-rw-rw-  1 nobody nogroup   1,   3 Mar  7 14:03 null
crw-rw-rw-  1 root   root      5,   2 Mar  7 15:44 ptmx
drwxr-xr-x  2 root   root           0 Mar  7 15:44 pts
crw-rw-rw-  1 nobody nogroup   1,   8 Mar  7 14:03 random
drwxrwxrwt  2 root   root          40 Mar  7 15:44 shm
lrwxrwxrwx  1 root   root          15 Mar  7 15:44 stderr -> /proc/self/fd/2
lrwxrwxrwx  1 root   root          15 Mar  7 15:44 stdin -> /proc/self/fd/0
lrwxrwxrwx  1 root   root          15 Mar  7 15:44 stdout -> /proc/self/fd/1
crw-rw-rw-  1 nobody nogroup   5,   0 Mar  7 15:41 tty
crw-rw-rw-  1 nobody nogroup   1,   9 Mar  7 14:03 urandom
crw-rw-rw-  1 nobody nogroup   1,   5 Mar  7 14:03 zero
crw-rw-rw-  1 nobody nogroup  10, 249 Mar  7 15:26 zfs
root@c1:~# mknod /dev/another c 1 9
root@c1:~# ls -la /dev/another
crw-r--r-- 1 root root 1, 9 Mar  7 15:44 /dev/another
root@c1:~# head -n 1 /dev/another
head: cannot open '/dev/another' for reading: Permission denied
root@c1:~# mknod /root/another c 1 9
root@c1:~# head -n 1 /root/another
root@c1:~# # some random data
root@c1:~# cat /proc/self/mountinfo 
476 446 252:0 /var/lib/incus/storage-pools/default/containers/c1/rootfs / rw,relatime,idmapped shared:405 master:1 - ext4 /dev/mapper/ubuntu--vg-ubuntu--lv rw
477 476 0:53 / /dev rw,relatime shared:406 - tmpfs none rw,size=492k,mode=755,uid=1000000,gid=1000000,inode64

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions