リダイレクトせずにファイルに書き込みますか?


12

特別なファイルを作成し、それに魔法のクッキーを書き込む必要がある通常のコンパイル済みアプリケーションを書いています。アプリケーションから直接ファイルを書き込むことはできません。システムセキュリティモデルでは、トリックを実行するために昇格された特権でヘルパーツールを起動する必要があります。ヘルパーツールに任意の数の引数を指定できます。次に、ヘルパーツールとして機能し、ファイルを作成する非常に単純なシステムコマンドを選択します。このようなもの:

/bin/sh -c "/bin/echo -n 'magic' > /some/where/file"

Simple touchは、Cookieをファイルに書き込む必要があるため、カットしません。echoシェルラッパーなしのSimple は、ファイルを書き込むためにリダイレクトが必要なため機能しません。そのような些細なタスクを実行するためにroot特権でシェルを呼び出すのは快適ではありません。ファイルを書き込むために呼び出すことができる本当にシンプルで制約のあるシステムコマンドはありますか?


/bin/sh -c 'echo magic > /path/to/magic/file'動作しない理由はありますか?これは、実行可能ファイルと2つの引数になります。最後の引数を文字列として構築する必要があります(sprintfまたは同等のものを使用)。これがうまくいかない理由はありますか?あなたの質問から、doCommandAsRoot()はコマンドにストリーミングするための入力を取らないように聞こえますよね?それ以外の場合は'cat > /path/to/magic/file'、文字列を作成する代わりに、最後の引数を置き換えてデータを渡すことができます。
Arcege

シェルの例は機能しますが、単純なファイルを作成するためだけにroot権限でシェルを呼び出すのは嫌です。ライブラリは通信パイプ引数(それはAuthorizationExecuteWithPrivileges)を取ります。これは、を使用してCookieを書き込むために使用できますtee。ありがとう!
zoul

回答:


11

これはどう:

echo -n 'magic' | sudo tee /some/where/file > /dev/null

確かにこれにはリダイレクトがありますが、シェルではなくrootとしてのみ実行されます。dd of=...でも動作します。


2
申し訳ありませんが、私は明らかに最近自分自身を説明するのに苦労しています。問題は、昇格された特権で何かを実行したい場合、特別なライブラリー呼び出し(のようなものdoCommandAsRoot)を実行する必要があることです。そして、この関数はコマンドとその引数へのパスのみを受け入れるため、出力リダイレクトをすぐに使用する方法はありません。(質問に示されているように)シェルを通過することはできますが、セキュリティの面でそれは好きではありません。
zoul

@zoul:私はあなたがシェルスクリプトを書いていると思った。権限のないプロセスがアクセスできるファイルにマジッククッキーを書き込んでも大丈夫ですか?もしそうなら、そのようなファイルにそれを書き込んでくださいdoCommandAsRoot("dd", "if=/tmp/unprotected_file", "of=/some/where/file")
stribika

いいえ、通常のコンパイル済みアプリケーションです(質問は更新されています)。自分で作成する必要がないように、ヘルパーとして機能する「シェル」コマンドを探しています。はい、Cookieは機密情報ではありません。dd例では、私が欲しいものにかなり近いです、ありがとうございました。もっと簡単なことを考えていただけますか?
zoul

もちろん、cpまたはのmv代わりに使用できますdd
mattdm

コピーする必要がないのと同じくらい簡単です:)
zoul

9

出力リダイレクトなし、パイプなし、ただし「ここに文字列」あり:

dd of=/some/where/file <<<'magic'

このアプローチの欠点の1つは、ddがいくつかの統計をstdoutに書き込むことです。> / dev / nullを使用してそれらを非表示にすることができますが、その時点でteeを使用することもできます。
studgeek 2018

1
これは、出力のリダイレクトやパイプを使用できない異常な状況で私にとってはうまくいきました。status=noneGNU coreutilsの最新バージョンからの他のすべての出力を抑制しますdd
マイケルハンプトン

5

もう1つの考慮事項があります。それは、マジックCookieの値を他のユーザーが監視できるため、コマンドラインに設定したくないということです。プログラムが短命であっても(プログラムがコマンドライン文字列をゼロにする場合を含む)、攻撃の機会があります。したがって、理論的:

writestringtofile 'magic' /some/where/file

危険なアプローチです。したがって、@ stribikaの提案を支持します。一時ファイルに値を書き込み、適切な場所にコピーします。安全な関数を使用して一時ファイル(mkstemp())を作成し、競合状態が発生しないようにしてください。


ありがとう、これは有用な議論です。幸い、「マジッククッキー」はセキュリティデバイスではないため、だれでも簡単に見ることができます。
zoul
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.