it-swarm-ja.com

共有ライブラリのロード中にエラーが発生しました

Ubuntu 16.04マシンにWineHQからWineをインストールしましたが、次のエラーが発生します。

/opt/wine-stable/bin/wine: error while loading shared libraries: libwine.so.1: cannot create shared object descriptor: Operation not permitted.

4
Les

簡単な答え–これを実行します:

Sudo sysctl -w vm.mmap_min_addr=0

長い答え:

Ubuntu 16.04から18.04にfromをアップグレードした後(およびWineHQからwine-stagingを再インストールした後)、1日前にまったく同じエラーが発生しました。

これは、Wineを介して(64ビットシステムで)32ビットのWindows実行可能ファイルを実行しようとしたときにのみ発生することがわかりました。

デバッグが多すぎた後、straceの下でWinenotepad.exeを実行しようとしたことから手がかりを得ました。

$ strace /usr/bin/wine notepad.exe
execve("/usr/bin/wine", ["/usr/bin/wine", "notepad.exe"], 0x7ffc266e8478 /* 55 vars */) = 0
strace: [ Process PID=19507 runs in 32 bit mode. ]
brk(NULL)                               = 0x7c423000

[ … 140 lines snipped … ]

openat(AT_FDCWD, "/opt/wine-staging/lib/libwine.so.1", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\220d\0\0004\0\0\0"..., 512) = 512
fstat64(3, {st_mode=S_IFREG|0644, st_size=1832828, ...}) = 0
mmap2(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = -1 EPERM (Operation not permitted)
close(3)                                = 0
writev(2, [{iov_base="/opt/wine-staging/bin/wine", iov_len=26}, {iov_base=": ", iov_len=2}, {iov_base="error while loading shared libra"..., iov_len=36}, {iov_base=": ", iov_len=2}, {iov_base="libwine.so.1", iov_len=12}, {iov_base=": ", iov_len=2}, {iov_base="cannot create shared object desc"..., iov_len=38}, {iov_base=": ", iov_len=2}, {iov_base="Operation not permitted", iov_len=23}, {iov_base="\n", iov_len=1}], 10/opt/wine-staging/bin/wine: error while loading shared libraries: libwine.so.1: cannot create shared object descriptor: Operation not permitted
) = 144
exit_group(127)                         = ?
+++ exited with 127 +++

重要なのはmmap2の失敗です。 mmap2マンページ (そして mmapマンページ )を読んだ後、8192バイトの匿名ブロックをマップしようとしているように見えました-リンクさえされていませんディスク上のファイルに。それは非常に退屈で、失敗するようなものではないように見えました。

そこで、sysctlの設定を調べて、Ubuntu 16.04→18.04のアップグレードで変更された可能性のあるもの、特にmmap2または単にmmapに影響を与える可能性のあるものがあるかどうかを調べたいと思いました。

/etc/sysctl.d/10-zeropage.confで有望な候補を見つけました:

# Protect the zero page of memory from userspace mmap to prevent kernel
# NULL-dereference attacks against potential future kernel security
# vulnerabilities.  (Added in kernel 2.6.23.)
#
# While this default is built into the Ubuntu kernel, there is no way to
# restore the kernel default if the value is changed during runtime; for
# example via package removal (e.g. wine, dosemu).  Therefore, this value
# is reset to the secure default each time the sysctl values are loaded.
vm.mmap_min_addr = 65536

これが有力な候補と思われた主な理由は、ワインについて言及しているためです。

その後、WineHQ Wikiでこのページを見つけました: プリローダーページゼロ問題

そのページでは、発生したエラーについて明示的に言及していませんが、疑わしいことに関連していると思われる他の多くのことについて言及しています。

そこで、「適切な回避策」、つまりSudo sysctl -w vm.mmap_min_addr=0の推奨事項を試しましたが、突然、WineでWindows32ビットアプリを再度実行できるようになりました。 :-)

注:WineHQ Wikiページには、その変更を永続的にするための手順も記載されていますが、そうすると、システムのセキュリティに影響が及ぶ可能性があります。

4
Pete