0

昇格したコンテキストで bash スクリプトを実行する単純な C ラッパー プログラムがあります。これは FastCGI ラッパーの背後にあり、いくつかのサービス フックが C プログラムを呼び出して、ルートとして bash スクリプトを実行できるようにします。私はセキュリティの問題を十分に認識しており、私の Web サーバーでは単一の IP アドレスのみが CGI-BIN スクリプトを呼び出すことを許可しています。私は両方のマシンを所有しているため、セキュリティ上のリスクはほとんどまたはまったくありません。私は C の完全な初心者で、文字通りインターネットからスニペットをコピーしました。

これまでのところ、これはうまくいきました:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>

int main()
{
   setuid( 0 );
   return system( "./myscript.sh" );
}

ただし、私のプログラムは FastCGI から POST データを取り込む必要があります。CGI 仕様では、すべての生の POST データを STDIN 経由で渡すと述べています。私が望むのは、この生の POST データを C プログラム/ラッパーの STDIN からスクリプトに直接パイプできるようにすることです。私はうまくいかなかった次のことを試しました:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>

int main()
{
   setuid( 0 );
   dup2(1, 0);
   return system( "./myscript.sh" );
}

通常のパイピング (例: echo "Hey" | ./myscript.sh) を使用すると、スクリプトは完全に正常に動作しますが、C プログラムの STDIN をスクリプトの STDIN にパイプする方法がわかりません。

4

2 に答える 2

0

これを試して、stdin の最後に改行を追加します。

int main()
{
   setuid( 0 );
   return system( "(cat; echo '') | ./myscript.sh" );
}
于 2013-11-10T04:57:48.397 に答える