Back to the news overview

LXC 3.2.1 リリースのお知らせ

24th of July 2019

はじめに

LXC チームは LXC 3.2.1 のリリースをお知らせできることをうれしく思います!

3.2.0 のリリースプロセスに問題があったため、3.2.1 をすぐにリリースしなければなりませんでした。このリリースで configure.ac ファイルにリリースが stable であることをす示すよう修正しました。

新機能

seccomp: システムコールのユーザースペースへのフォワーディングのサポート

新しいカーネルでは、seccomp がインターセプトしたシステムコールを専用のファイルディスクリプタに転送できます。これらのメッセージは読むことができ、システムコールの引数が検査され、検査の結果がセキュアであるとわかれば、十分な特権を持ったユーザースペースのプロセスが通常はカーネルがコンテナのために行うアクションを実行できます。

LXC では、他のプロセスに対してメッセージを送ったり受け取ったりするプロトコルを新たに導入しました。ユーザーは unix:<path> のフォーマットで lxc.seccomp.notify.proxy に設定することで Unix ソケットアドレスを指定できます。これを使って、LXC はインターセプトされたシステムコールを転送し、適切な応答を待ちます。

ユーザーは、LXCが転送されたシステムコールを読むプロセスに送り返す lxc.seccomp.notify.cookie を通して、クッキーを設定することができます。これにより、待ち受けるプロセスはどのコンテナがメッセージを送ったのかを識別できます。

この機能を使って、LXD は例えば、mknod()mknodat() システムコールを使ったデバイスノードの作成ができます。このようなことは、セキュアなデバイスが明確に定義されているコンテナでは通常は禁止されています。

設定 lxc.seccomp.allow_nesting の追加

このリリースで lxc.seccomp.allow_nesting API 拡張を追加しました。lxc.seccomp.allow_nesting が 1 に設定されている場合、seccomp プロファイルはスタックされます。このように、ネストされたコンテナが、祖先のコンテナが適用した可能性のあるポリシーに加えて、自身の seccomp ポリシーをロードできます。

ネットワーク: IPVLAN サポート

LXC で IPVLAN が使えるようになりました。ネットワーク設定の例は次のようになります:

lxc.net[i].type=ipvlan
lxc.net[i].ipvlan.mode=[l3|l3s|l2] (defaults to l3)
lxc.net[i].ipvlan.flags=[bridge|private|vepa] (defaults to bridge)
lxc.net[i].link=eth0
lxc.net[i].flags=up

ネットワーク: レイヤー 2(ARP/NDP)プロキシモードの追加

LXC はレイヤー 2 ARP/NDP プロキシモードをサポートするようになりました。次のように有効に出来ます:

lxc.net.[i].l2proxy = [0,1] (defaults to 0)

ネットワーク: ゲートウェイのデバイスルートモードの追加

LXC で lxc.net.[i].ipv4.gateway もしくは lxc.net.[i].ipv6.gateway、またはその両方に dev という値を設定できるようになりました。これにより、デフォルトゲートウェイとしてデバイスのルートが設定されます。

ネットワーク: スタティックルートのサポート

このリリースでは、新たにふたつの設定項目を追加しました

lxc.net.[i].veth.ipv4.route
lxc.net.[i].veth.ipv6.route

これにより、ユーザーは veth インターフェースにスタティックルートを設定できます。

Networking: Add router veth mode

LXC に veth ネットワークに対する新たなルーターモードが追加されました。この "router" モードは、コンテナのホスト側の veth インターフェースを指す、コンテナの IP アドレスに対するスタティックルートをホスト上で追加することで、ホストマシンをコンテナに対するルーターとして設定します。また、コンテナにホストへのゲートウェイを提供するために、ホストのリンクインターフェースの IP アドレスもしくは静的に設定された IP アドレスのいずれかの、スタティックな IP プロキシエントリをホスト側の veth インターフェースに追加します。

次にネットワークをどのように設定するのかの例を示します:

lxc.net.0.type = veth
lxc.net.0.veth.mode = router
lxc.net.0.link = eth0
lxc.net.0.flags = up
lxc.net.0.ipv4.address = 192.168.1.x/32
lxc.net.0.ipv6.address = 2a02:xxx:xxx:1::x/128
lxc.net.0.ipv4.gateway = auto
lxc.net.0.ipv6.gateway = auto
lxc.net.0.link = host-eth0
lxc.net.0.l2proxy = 1

これにより、次のようなプロパティを持つ IPVLAN 風のネットワークモードが提供します:

  • 古いカーネルでも動作する
  • IPVLAN と違い、パケットを(コンテナ間や異なるインターフェース間の可能性がある)ルーティングするためにホストのルーティングテーブル(とネットフィルターのルール)を使う
  • コンテナが自身の IP アドレスを変えることを防ぐ
  • コンテナから、コンテナに向けたブロードキャストやマルチキャストのトラフィックを防ぐ
  • すべてのコンテナに外部的には同じ MAC アドレスを提供する
  • 管理するブリッジインターフェースがない
  • ローカルのルーティングテーブルにあるコンテナの IP アドレスを広域のネットワークに配布するために、ホスト上で BGP(や他のルーティングプロトコル)が実行されている設定に対して、レイヤー 3 のみのモードをサポートする
  • コンテナは、既存の l2proxylink 設定を使って、レイヤー 2 のローカルな LAN 上でアクセス可能な IP アドレスをオプションで持てる

pidfd: 新しい pidfd API の初期サポート

新しいバージョンのカーネルでは、プロセスファイルディスクリプタ(pidfds)を通してプロセスと対話できます。これにより、例えばシグナルの送信やプロセス情報の取得のような場合での様々な競合状態が解消されます。このバージョンの LXC では、pidfd_send_signal() システムコールと、clone() システムコールに対して CLONE_PIDFD フラグを使います。

ハードニング: さらにコンパイラベースのハードニングを追加

最近のいくつかのリリースで、C のコードベースを堅牢にするためにコンパイラが提供するオプションを有効にしました。このリリースでは次のものを有効にしました:

-Wlogical-op
-Wmissing-include-dirs
-Wold-style-definition
-Winit-self
-Wfloat-equal
-Wsuggest-attribute=noreturn
-Werror=return-type
-Werror=incompatible-pointer-types
-Wformat=2
-Wimplicit-fallthrough=5
-Wshadow
-Wendif-labels
-Werror=overflow
-fdiagnostics-show-option
-fstack-protector-strong
-Werror=shift-count-overflow
-Werror=shift-overflow=2
-Wdate-time
-Wnested-externs
-fasynchronous-unwind-tables
-pipe
-fexceptions

ハードニング: すべてのスタック割当てを削除

スタックベースのメモリ割り当て(例えば alloca() を使った)は、非常に深刻なメモリのバグを引き起こす可能性があります。そのため、LXC ではすべてのスタックベースのメモリ割り当てを削除し、新しいコードでも追加は許可しません。

ハードニング: LGTM のサポート

LGTM コード解析ツールのサポートを追加しました。LXC のコードは現在 A+ にランク付けされていてハッピーです。

ハードニング: coccinelle のサポート

coccinelle コード解析(変形)ツールのサポートを追加しました。これによりコードを自動的に変更し、例えば alloca() のような使わない関数を手動で置き換える際のエラーを排除できます。

ハードニング: コンパイラベースのリソースクリーンアップ

gccclang と言ったコンパイラがサポートするクリーンアップ属性を使用するために、コードベースはゆっくりと切り替わります。

ハードニング: コードベースから fgets() を削除

セキュリティの改善のため、fgets() をコードベースからすべて削除しました。今後、この関数を新たにコードで使用することは推奨しません。

ハードニング: Hardening: Expand close-on-exec usage

close-on-exec にできるファイルディスクリプタは、すべて close-on-exec になりました。

cgroup v2 で /sys/kernel/cgroup/delegate ファイルを使用

このファイルは委任可能な(つまり、所有権を委任者のユーザー ID に変更する必要がある) cgroup v2 ファイルの(1 行に 1 つの)リストを表示します。LXC はこのファイルを使い、正しく cgroup の委任を行う方法を決定します。

cgroup なしのレイアウトを扱う

LXC は、書き込み可能な cgroup がない状態のシステムでコンテナを起動できます。

cpuset でオフラインの CPU を扱う

コンテナの cgroup から隔離する CPU を削除するのに加えて、LXC はコンテナの cpuset からオフラインの CPU も削除するようになりました。

コンテナごとに新しい boot id を生成

LXC は、コンテナごとに新たにランダムの boot id を生成し、それを /proc/sys/kernel/random/boot_id にマウントするようになりました。これで systemd が各コンテナのブートを認識できるようになりました。

統一されたネットワーク作成

LXC は特権コンテナであっても非特権コンテナであっても統一した方法でネットワークを作成し、コードを大幅に単純化します。

セキュリティ: runC の CVE-2019-5736 に対する修正

このリリースでは、今年初めに発見された特権コンテナの脱獄に対する修正が含まれています。我々のポリシーでは、特権コンテナは安全であるとは考えていません。それゆえ LXC はこの CVE を受けていないと考えています。しかし、このリリースでは修正が含まれています。詳細については このブログポスト をご覧ください。

バグ修正(翻訳なし)

  • lxc-download: Pre-release bump of compat
  • seccomp: open memfd read-write
  • doc: Documents the lxc.net.[i].veth.mode option
  • network: Adds veth router mode static routes and proxy entries
  • network: Adds mode param (bridge, router) to veth network setting
  • lxc/log: Adds error_log_errno macro
  • doc: Add lxc.comp.notify.cookie to Japanese lxc.container.conf(5)
  • cgroup: check for non-empty conf
  • seccomp: coding style
  • af_unix: remove unused variable
  • seccomp: send caller pidfd along with proxied requests
  • seccomp: recvmsg with MSG_TRUNC
  • doc: document lxc.seccomp.notify.cookie
  • seccomp: defer reconnecting to the proxy
  • seccomp: keep retrying to reconnect to proxy
  • seccomp: send default response when there's no proxy
  • seccomp: retry connecting to the proxy once
  • seccomp: don't ignore syscalls when there's no proxy
  • seccomp: remove reconnect-loop
  • seccomp: use SOCK_SEQPACKET for the notify proxy
  • seccomp: assert that __reserved is 0 in notify responses
  • seccomp: update notify api
  • conf: add lxc.seccomp.notify.cookie
  • file_utils: add lxc_recvmsg_nointr_iov
  • af_unix: add lxc_unix_connect_type
  • af_unix: add lxc_abstract_unix_recv_fds_iov()
  • af_unix: add lxc_abstract_unix_send_fds_iov
  • pidf_send_signal: fix return value
  • lxccontainer: properly cleanup on mount injection failure
  • start: call lxc_find_gateway_addresses early
  • network: simplify lxc_network_move_created_netdev_priv()
  • network: send names for all non-trivial network types
  • network: record created_name for instantiate_phys()
  • network: simplify instantiate_phys()
  • network: record created_name for instantiate_vlan()
  • network: simplify instantiate_vlan()
  • network: record created_name for instantiate_ipvlan()
  • network: simplify instantiate_ipvlan()
  • network: stash created_name in instantiate_macvlan()
  • network: simplify instantiate_macvlan()
  • network: s/loDev/loop_device/g
  • cgroups: handle cpuset initialization race
  • network: remove faulty restriction
  • fix memory leak in do_storage_create
  • cgroups: move variable into tighter scope
  • cgroups: correctly order variables
  • cgroups: simplify cgfsng_nrtasks()
  • cgroups: simplify cgfsng_setup_limits()
  • cgfsng: fix memory leak in lxc_cpumask_to_cpulist
  • lxccontainer: rework seccomp notify api function
  • cgfsng: write cpuset.mems of correct ancestor
  • parse.c: fix fd leak from memfd_create
  • lxc.pc.in: add libs.private for static linking
  • Fixed file descriptor leak for network namespace
  • network: fix lxc_netdev_rename_by_index()
  • Switch from gnutls to openssl for sha1
  • doc: add a note about shared ns + LSMs to Japanese doc
  • seccomp: do not set SECCOMP_FILTER_FLAG_NEW_LISTENER
  • Centralize hook names
  • seccomp: add ifdefine for SECCOMP_FILTER_FLAG_NEW_LISTENER
  • seccomp: s/SCMP_FLTATR_NEW_LISTENER/SECCOMP_FILTER_FLAG_NEW_LISTENER/g
  • seccomp: s/HAVE_DECL_SECCOMP_NOTIF_GET_FD/HAVE_DECL_SECCOMP_NOTIFY_FD/g
  • seccomp: /sseccomp_notif_free/seccomp_notify_free/g
  • seccomp: s/seccomp_notif_alloc/seccomp_notify_alloc/g
  • seccomp: s/seccomp_notif_id_valid/seccomp_notify_id_valid/g
  • seccomp: s/seccomp_notif_send_resp/seccomp_notify_respond/g
  • seccomp: s/seccomp_notif_receive/seccomp_notify_receive/g
  • seccomp: s/seccomp_notif_get_fd/seccomp_notify_fd/g
  • seccomp: s/SCMP_ACT_USER_NOTIF/SCMP_ACT_NOTIFY/g
  • cgroups: prevent segfault
  • start: fix handler memory leak at lxc_init failed
  • lxc_usernsexec: continuing after unshare fails leads to confusing and misleading error messages
  • getgrgid_r fails with ERANGE if buffer is too small. Retry with a larger buffer.
  • lxc_clone: add a comment about stack size
  • lxc_clone: bump stack size to 8MB
  • configure: remove additional comma
  • lxccontainer: cleanup attach functions
  • attach: do not reload container
  • network: Fixes bug that stopped down hook from running for phys netdevs
  • network: move phys netdevs back to monitor's net ns rather than pid 1's
  • lxc_clone: get rid of some indirection
  • doc: add a little note about shared ns + LSMs
  • lxc_clone: pass non-stack allocated stack to clone
  • configure: handle checks when cross-compiling
  • Use %m instead of strerror() when available
  • Config: check for %m availability
  • initutils: Fix memleak on realloc failure
  • zfs: Fix return value on zfs_snapshot error
  • lvm: Fix return value if lvm_create_clone fails
  • criu: Remove unnecessary return after _exit()
  • criu: Use -v4 instead of -vvvvvv
  • Option --busybox-path instead of --bbpath
  • New --bbpath option and unnecessary --rootfs checks
  • coding style: update
  • start: use CLONE_PIDFD
  • api: Adds the network_phys_macvlan_mtu extension
  • network: Restores phys device MTU on container shutdown
  • network: Adds mtu support for phys and macvlan types
  • raw_syscalls: simplify assembly
  • utils: improve switch_to_ns()
  • doc: Fix and improve Japanese translation
  • doc: Update Japanese lxc.container.conf(5)
  • network: Re-works veth gateway logic
  • network: Makes vlan network interfaces set mtu before upscript called
  • network: Adds custom mtu support for ipvlan interfaces
  • seccomp: document path calculation
  • compiler: add __returns_twice attribute
  • seccomp: send process memory fd
  • namespaces: allow a pathname to a nsfd for namespace to share
  • seccomp: ensure fields are set to 0
  • seccomp: remove alignment requirements
  • seccomp: notifier fixes
  • network: Makes some routing functions static
  • network: Fixes bug in macvlan mode selection
  • network: Fixes vlan hook script
  • network: Fixes a little typo in an error message
  • start: silence clang
  • Fix 'zfs get' command order
  • lxc-start: remove bad doc
  • netns_getifaddrs: adapt to kernel changes
  • configure: s/LDLAGS/LDFLAGS/
  • conf: do lxc.mount.entry mounts right after lxc.mount.fstab
  • raw_syscalls: lxc_raw_clone()
  • hooks/nvidia: handle spaces in NVIDIA_REQUIRE variables
  • storage: update zfs
  • storage: prevent uninitialized variable warning
  • cgroups: fix potential nullderef
  • attach: use tighter scope for fd variable
  • fix: #2927 api doc generation fails under out of source build.
  • Fix monitor pdeathsig handling
  • Fix user namespace pdeathsig handling
  • network: fix network device removal
  • doc: Add the description of apparmor profile generation to man pages
  • doc: Add lxc.rootfs.managed to lxc.container.conf(5)
  • doc: Add lxc.cgroup.relative to lxc.container.conf(5)
  • lvm: Updates lvcreate to wipe signatures if supported, fallbacks to old command if not.
  • lxccontainer: check do_lxcapi_init_pid() for failure
  • start: fix parent PID passed to lxc_set_death_signal
  • utils: fix handling of PID namespaces in lxc_set_death_signal
  • btrfs: ensure \0 byte at end
  • Fix lxc.cgroup2. on cgroup2-only systems
  • conf: avoid compiler warning
  • confile: make parse_limit_value() static
  • confile_utils: make update_hwaddr() static
  • confile_utils: lxc_config_net_is_hwaddr()
  • cgroups: remove unused variables
  • attach: remove unused variable
  • Fix android compilation
  • CODING_STYLE: update
  • conf: remove unused variable
  • gpg: use proxy, if http_proxy is set
  • conf: simplify idmaptool_on_path_and_privileged
  • lxc-attach: switch to attach_run_wait
  • travis: run coccinelle
  • Fix existing mount target check
  • cve-2019-5736: add test
  • rexec: try sendfile() fallback to fd_to_fd()
  • [V2] rexec: handle legacy kernels
  • rexec: use __do_close_prot_errno
  • memory_utils: introduce __do_close_prot_errno
  • macro: introduce steal_fd()
  • commands: move declaration into tighter scope
  • start: move variable into tighter scope
  • mount: Cleanup allow over-mounting
  • mount: Allow over-mounting
  • network: do not log false friends
  • conf: do not log devpts umount2() failure
  • rexec: remove envp parsing in favour of environ
  • apparmor: Improve testing on apparmor python script
  • apparmor: catch config file opening error
  • rexec: make rexecution opt-in for library callers
  • include: add fexecve() for Android's Bionic
  • parse: handle \r
  • cgfsng: fix cgroup creation
  • coccinelle: use standard exit identifiers
  • coccinelle: s/while({1,true})/for(;;)/
  • lxc-init: exit with error on wait failure
  • start: prevent signed-issues
  • cgfsng: remove unnecessary check
  • commands: remove unnecessary check
  • caps: check uid and euid
  • memory_utils: add memory_utils.h
  • fix rpm packaging for bash completion directory.
  • cgroups: use of /sys/kernel/cgroup/delegate file
  • doc: Add lxc.seccomp.allow_nesting to Japanese lxc.container.conf(5)
  • prlimit: remove deprecated and unneeded header
  • compiler: remove deprecated and unneeded header
  • conf: append 0 0 to nesting helpers mount entries
  • Use BUSYBOX_EXE variable in configure_busybox()
  • conf: check for successful mount entry parse
  • Installation of default.script for udhcpc
  • Avoid double lxc-freeze/unfreeze
  • Update freezer.c
  • Handle alternative loop device location on Android
  • Fixing hooks functionality Android where 'sh' is placed under /system/bin
  • Fix memory leak in cgroup_exit
  • conf.c: fix memory leak and mount error
  • start: __lxc_start return -1 when start fails
  • network: prefix veth interface name with uid info
  • start: handle missing CLONE_NEWCGROUP
  • Fixing compile error when compiling for android
  • Merge pull request #2774 from hn/master
  • fix: unprivileged veth devices (e.g. vethFWABHX) never contain 'Z' character in the randomly generated device name part because for modulo one does not need to subtract 1 from strlen().
  • cgfsng: do not free container_full_path on error
  • confile: add lxc.seccomp.allow_nesting
  • lxccontainer: fix container copy
  • conf: use SYSERROR on lxc_write_to_file errors
  • lxccontainer: fix mount api (mount_injection_file)
  • storage: do not destroy pre-existing rootfs
  • terminal: remove sigwinch command

サポートとアップグレード

LXC 3.2 は LTS リリースではありません。したがって、LXC 3.3 がリリースされるまでのみサポートされます。強力なサポートのコミットが必要なユーザーは LTS リリースを使い続けることをおすすめします。

ダウンロード