Linux雑多メモ(2017/01/09)

● 名前偽装ネタ
ネタもと
$0書き換えが流行っているようなので一つ流行に乗っかってみるか
psで表示されるコマンド名を変更する

・/proc/(PID)/comm は書ける(rw)
・/proc/(PID)/cmdline は書けない(r)
・cmdlineは、pthread_setname_np(3)(libpthreadの中で結局prctl(2)のPR_SET_NAME)で設定できる。
・cmdlineは、直接argv[0]@argcを書き換えてもよい。が、argvのバッファ管理までは手を出せないので長さ変更するのは注意
 → argvはexec時にKernelがユーザスタック上に確保する
  (正確には、ユーザスタックに化ける前のメモリ領域に確保する)
 → __bprm_mm_init()あたり。この辺に詳しい

● zlib関係
以前紹介した圧縮ツールの記事から、zlib関連をちょっと漁ってみた。
・zopfliは確かに圧縮率が高い(3%ほど削れる)、が圧縮に時間かかりすぎなので、ビルド毎に走らせるのはつらい。。単純に*.gzと*.png作成に使うのかなぁ。pngの再圧縮はパッケージに付属するzopflipngで行える。png再圧縮はoptipngとあわせて使うとさらによい。
・cloudflare/zlibは、x86_64のSIMD前提で、x86_64以外はコンパイルすら通らなかった。
・intel/zlibは、x86_64じゃなくてもコンパイルは通るものの、やはりx86_64のSIMD前提。
・zlib-ngは、x86_64のSIMD前提だけど、x86_64じゃなくても恩恵を受ける。minigzipベンチでオリジナル比で3%ほど早くなる。
というわけで、x86_64以外なら、とりあえずzlib-ngを使えばいいと思います。zlib-ngは他arch対応の準備も形だけはできているので、誰かがNEON対応を書けばarm/aarch64も早くできるんじゃないかなぁ(他人任せ)

● その他
prctl(2)はLinux固有のシステムコールだけど、いろいろできることが多いので一通り確認しておいた方がよい。
・PR_SET_CHILD_SUBREAPER で、子孫の孤児になったプロセスを引き取る init っぽいことができる。
・PR_SET_PDEATHSIG で、親が死んだ時に子どもにシグナルを送れる。SIGKILL 登録しといて親が死んだら子どもも即死というパターンで使うのが多いみたい。

上記使えばinitっぽく見えるinitじゃないプログラムを作れる。が、PIDは1になれない。pid_namespaces(7)を使えば、namespaceの中からはPID 1に見えるが、namespaceの外からはPID 1になれない。まぁそこまでごまかせたらセキュリティホールそのものなので、できないのは当然ていえば当然だけど。

このブログ記事について

このページは、らるるが2017年1月 9日 04:33に書いたブログ記事です。

ひとつ前のブログ記事は「libprocps programming」です。

次のブログ記事は「Linux Kernel Updates 読んだ」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

月別 アーカイブ

ウェブページ

Powered by Movable Type 7.9.0