Skip to content

Plan 9のprivateプロセスはデバッガでアタッチできない

This content is a draft and will not be included in production builds.

auth/factotumなど、機密情報を扱うプロセスはprivateでありnoswapになっている。

privateプロセスへの変更は、/proc/(pid)/ctlprivateと書けばプライベートとなり、他のプロセスから保護される。また、noswapと書けばスワップの対象にならない。この処理はカーネルの /sys/src/9/port/devproc.c で実装される。

/* 重要なところだけ抜粋 */
void
procctlreq(Proc *p, char *va, int n)
{
cb = parsecmd(va, n);
ct = lookupcmd(cb, proccmd, nelem(proccmd));
switch(ct->index){
case CMnoswap:
p->noswap = 1;
break;
case CMprivate:
p->privatemem = 1;
break;
}

このとき、acidでデバッグしたり、killしようとしても、保護されているので

mem: permission denied

となってアタッチできない。この処理は上記と同じファイルのprocopenで実装されている。

static Chan*
procopen(Chan *c, int omode)
{
switch(QID(c->qid)){
case Qnote:
if(p->privatemem)
error(Eperm);
break;
case Qmem:
case Qctl:
if(p->privatemem)
error(Eperm);
nonone(p);
break;
}

auth/factotum-p(または-d)フラグを与えるとprivateにもnoswapにもならないので、デバッグしたい場合はフラグを与えるといい。

ソースコードはこのあたり。