2017-01-05 5 views
0

ネットワーク用のほぼ完全なイディオスリムなコンフィギュレータと、Linux上で動作する組み込み機器用のものがあります。アプリケーションはrootで実行すると問題なく/ etc/network/interfacesに保存されますが、標準ユーザーが実行すると "segmentation fault"が返されます。 straceのが返さ:ルート以外のアプリケーションで/ etc内の読み取り専用ファイルを変更できるようにする

オープン( "の/ etc /ネットワーク/インタフェース"、O_WRONLY | O_CREAT | O_TRUNC、0666)= -1 EACCES(許可拒否) --- SIGSEGV {si_signo = SIGSEGV、si_codeに= SEGV_MAPERR、 si_addr = 0} ---

どのようにすれば誰でも起動でき、/ etc/network/interfacesに書き込むことができますか?ファイルに保存するための

コード:

  FILE *saveFile; 
      saveFile = fopen("/etc/network/interfaces","w"); 
      // loopback 
      fprintf(saveFile, "auto lo \niface lo inet loopback\n\n"); 
      // eth0 
      fprintf(saveFile, "auto eth0\niface eth0 inet static\n\taddress %s\n\tnetmask %s\n\tgateway %s\n", 
        address,netmask,gateway); 
      fclose(saveFile); 
+2

:なぜドン;あなたは 'はfopen()'最初の成功のためのチェックをt? –

+1

'chmod a + w/etc/network/interfaces'またはプログラムsuid rootを –

+2

にするだけでrootアクセスが必要です。 root以外のユーザーには、インターフェース情報の変更を許可してはいけません。 – Downvoter

答えて

0

あなたはこのような何かを試すことができます。

  • インストールsudoの
  • だけであなたのプログラム上の新しいユーザーの新しいユーザーに
  • 与えるのはsudo権限を作成します。

このように、プログラム以外のコマンドを実行しようとすると、そのプログラムは拒否されます。

あなたのプログラムはsudo rigthで実行されるので、あなたのプログラムは(chmod 700やchown rootのような)別のプログラムで変更や置き換えができないことを確認して、プログラムが/ etc/network/interface

+0

それは働いているように見えますが、セキュリティ問題とSerge Ballestaのようなリターンテストを処理しなければなりません。あなたの答えをありがとう – mslo

+0

はい、いつ誰かがあなたのプログラムでシステムを混乱させる方法を見つけると、あなたは大きな問題に遭うかもしれません。明らかに、ユーザーの入力を確認し、再度確認し、失敗する可能性のあるすべての機能をチェックします(あなたのSIGSEVは私に冷たい汗を与える)。 –

1

は、どのように私はそれが誰によって起動され、/ etc/network/interfacesのに書き込むことができるようにすることができますか?

Mmmmm .../etc/network/interfacesの誰かに書き込み権限を与えることによって、

+0

本当に良いアドバイスだと確信していますか?あなたは自分のマシンでそれをしますか? **私は確かにしません! –

+0

私はここでアドバイスをしていません。文字通り質問に答えるだけです。 – Tristan

1

あなたのコメントの後に、root権限を持たないユーザーがroot権限を必要とする特定の管理タスクを実行できるようにする必要があります。伝統的な方法は、プログラムをrootとsetuidが所有するようにすることです。バッファオーバーフローなどの理由で、任意のコードをルートとして実行する可能性があるため、setuidプログラム(suまたはsudo)を徹底的に調べる必要があります。

単純なプログラムであれば意味がありますが、少なくともすべての操作(ここではfopenfwrite)の戻り値をテストする必要があります。

sudoを使用し、/etc/sudoersファイルの特定のエントリを設定して、任意のユーザ(またはグループやユーザの特定のリスト)がその特定のコマンドをrootとして実行できるようにすることをお勧めします。 setuidのコマンドことはほぼ同じことを達成したが/管理タスクの彼女を彼に気づくために彼/彼女のパスワードの入力をユーザーに要求するには:

ALL local_host_name = (root) /full/path/to/command 

しかし、sudoersファイルの構文は非常に細かい粒度の権限を許可します。

(注意してください:あなたはまだ二回あなたのコードを制御する必要がある)おそらくトピックオフ

関連する問題