libnss-stns-v2とohaiを組み合わせたときにSEGVする

いずれ調べるかって思ってたやつちゃんと調べた。

エラーメッセージ的にはこんな感じ。

g /opt/chef/embedded/lib/ruby/gems/2.5.0/gems/ohai-14.4.2/lib/ohai/plugins/passwd.rb:19: [BUG] Segmentation fault at 0x00007f521bce3e20
g ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-linux]
g 
g -- Control frame information -----------------------------------------------
g c:0026 p:---- s:0135 e:000134 CFUNC  :passwd
g c:0025 p:0073 s:0131 e:000130 BLOCK  /opt/chef/embedded/lib/ruby/gems/2.5.0/gems/ohai-14.4.2/lib/ohai/plugins/passwd.rb:19 [FINISH]
g c:0024 p:---- s:0128 e:000127 CFUNC  :instance_eval
g c:0023 p:0058 s:0124 e:000123 METHOD /opt/chef/embedded/lib/ruby/gems/2.5.0/gems/ohai-14.4.2/lib/ohai/dsl/plugin/versionvii.rb:128
g c:0022 p:0058 s:0118 e:000117 METHOD /opt/chef/embedded/lib/ruby/gems/2.5.0/gems/ohai-14.4.2/lib/ohai/dsl/plugin.rb:104
g c:0021 p:0004 s:0114 e:000113 METHOD /opt/chef/embedded/lib/ruby/gems/2.5.0/gems/ohai-14.4.2/lib/ohai/dsl/plugin.rb:187
g c:0020 p:0174 s:0109 e:000108 METHOD /opt/chef/embedded/lib/ruby/gems/2.5.0/gems/ohai-14.4.2/lib/ohai/runner.rb:87
g c:0019 p:0070 s:0101 e:000100 BLOCK  /opt/chef/embedded/lib/ruby/gems/2.5.0/gems/ohai-14.4.2/lib/ohai/runner.rb:48
g c:0018 p:0039 s:0097 e:000096 METHOD /opt/chef/embedded/lib/ruby/2.5.0/benchmark.rb:293
g c:0017 p:0011 s:0088 e:000087 METHOD /opt/chef/embedded/lib/ruby/gems/2.5.0/gems/ohai-14.4.2/lib/ohai/runner.rb:41
g c:0016 p:0009 s:0082 e:000081 BLOCK  /opt/chef/embedded/lib/ruby/gems/2.5.0/gems/ohai-14.4.2/lib/ohai/system.rb:93 [FINISH]
g c:0015 p:---- s:0078 e:000077 CFUNC  :each
g c:0014 p:0019 s:0074 e:000073 METHOD /opt/chef/embedded/lib/ruby/gems/2.5.0/gems/ohai-14.4.2/lib/ohai/system.rb:92
g c:0013 p:0021 s:0065 e:000064 METHOD /opt/chef/embedded/lib/ruby/gems/2.5.0/gems/ohai-14.4.2/lib/ohai/system.rb:83
g c:0012 p:0048 s:0060 e:000059 METHOD /opt/chef/embedded/lib/ruby/gems/2.5.0/gems/chef-14.4.56/lib/chef/client.rb:608
g c:0011 p:0204 s:0054 e:000053 METHOD /opt/chef/embedded/lib/ruby/gems/2.5.0/gems/chef-14.4.56/lib/chef/client.rb:260
g c:0010 p:0014 s:0042 E:000950 METHOD /opt/chef/embedded/lib/ruby/gems/2.5.0/gems/chef-14.4.56/lib/chef/application.rb:303
g c:0009 p:0091 s:0038 e:000037 BLOCK  /opt/chef/embedded/lib/ruby/gems/2.5.0/gems/chef-14.4.56/lib/chef/application.rb:279
g c:0008 p:0007 s:0034 e:000033 METHOD /opt/chef/embedded/lib/ruby/gems/2.5.0/gems/chef-14.4.56/lib/chef/local_mode.rb:44
g c:0007 p:0040 s:0030 e:000029 METHOD /opt/chef/embedded/lib/ruby/gems/2.5.0/gems/chef-14.4.56/lib/chef/application.rb:261
g c:0006 p:0099 s:0025 e:000024 METHOD /opt/chef/embedded/lib/ruby/gems/2.5.0/gems/chef-14.4.56/lib/chef/application/client.rb:440
g c:0005 p:0019 s:0020 e:000019 METHOD /opt/chef/embedded/lib/ruby/gems/2.5.0/gems/chef-14.4.56/lib/chef/application.rb:66
g c:0004 p:0063 s:0016 e:000015 TOP    /opt/chef/embedded/lib/ruby/gems/2.5.0/gems/chef-14.4.56/bin/chef-client:25 [FINISH]
g c:0003 p:---- s:0013 e:000012 CFUNC  :load
g c:0002 p:0585 s:0008 E:0006f0 EVAL   /usr/bin/chef-client:75 [FINISH]
g c:0001 p:0000 s:0003 E:000d60 (none) [FINISH]

ワークアラウンドとしては、chef打つ前にssh打って、getent passwd/group とか実行してキャッシュを作っておいて、stnsにhttpリクエストさせなければ普通に動く。

本題としては、libcrypto.soがembededなohaiとシステムのものを利用するstnsで異なることから、どちらのsoのファンクションを利用するか衝突しているようだった。

7f521b591000-7f521b82c000 r-xp 00000000 fc:01 2967                       /usr/lib/x86_64-linux-gnu/libcrypto.so.1.1
7f521b82c000-7f521ba2b000 ---p 0029b000 fc:01 2967                       /usr/lib/x86_64-linux-gnu/libcrypto.so.1.1
7f521ba2b000-7f521ba57000 r--p 0029a000 fc:01 2967                       /usr/lib/x86_64-linux-gnu/libcrypto.so.1.1
7f521ba57000-7f521ba59000 rw-p 002c6000 fc:01 2967                       /usr/lib/x86_64-linux-gnu/libcrypto.so.1.1
7f5220b97000-7f5220da7000 r-xp 00000000 fc:01 537824                     /opt/chef/embedded/lib/libcrypto.so.1.0.0
7f5220da7000-7f5220fa7000 ---p 00210000 fc:01 537824                     /opt/chef/embedded/lib/libcrypto.so.1.0.0
7f5220fa7000-7f5220fc2000 r--p 00210000 fc:01 537824                     /opt/chef/embedded/lib/libcrypto.so.1.0.0
7f5220fc2000-7f5220fce000 rw-p 0022b000 fc:01 537824                     /opt/chef/embedded/lib/libcrypto.so.1.0.0

基本的にnssモジュールはプロセスにリンクされるので、プロセスから名前解決のメソッドが呼ばれると、その先でstnsはcurlを打つので、そこでopensslもリンクされて、ぶつかるみたいな事象に見える。

対応としてはどうすっかなぁ。opensslをstaticリンクするか、はたまた何かしらの仕組みを入れてchefとか特定のプロセスのときはhttpを利用した名前解決しないようにするか。。。ちょい考える。