投稿する

シェルについて [1853]

 八王子さん(No.1) 
https://www.ipa.go.jp/shiken/mondai-kaiotu/gmcbt80000008smf-att/2022r04a_sc_pm1_qs.pdf

令和4年午後1の4Pについてです。
「setvalueが図3中のパラメータを含むコマンド文字列をシェルに渡すと」とあります。
『ユーザ→スマホのアプリ→製品R』という構図で、文章や回答の意味合いから何となく製品Rのシェルだとは予測できますが、いまいちシェルが理解しきれていません。

・スマホは、製品Rにリクエストを送るだけであるから、スマホのシェル等は関係ない
・アプリからのリクエストを受け取った製品Rのシェルが、それを馬鹿正直に実行してしまう構造をしているのが問題。

ということでしょうか?

また、シェルとはGUIシェルとCLIシェルに大別されると聞きました。
そしてカーネルはシェルに囲まれているような形であり、カーネルを直接触ることはできないとも聞きました。

では、アプリケーションが外部にPOST通信する時、これはシェルもカーネル?も使っていない処理なのでしょうか?それともアプリが裏で何らかのシェルとやり取りをしているのでしょうか?

取っ散らかった質問で申し訳ございません。
2025.03.07 23:53
むぐむぐさん(No.2) 
SC ブロンズマイスター
シェルとはOSと対話するためのものです。
例えばあなたがwindowsのPCでファイルを作成したいとします。
でもHDDを直接操作してデータを入れることはできませんよね?
そのためOSに指示を出して、OSにHDDを操作してもらいファイルを作成してもらう必要があります。

Windowsなら右クリックして新規作成→フォルダーを選択することでフォルダを作ることができます。これはWindows Explorerを通してOSと対話たためで、OSがHDDを操作してくれています。これがGUIです。

WindowsではcmdやPowerShellがCLIにあたります。
cmdを開いて
mkdir C:\test
と入力するとCドライブ直下にtestフォルダが作成されます。

製品RはlinuxベースのOSを用いるとあるので、製品Rではシェルを使用することで製品RのOSと対話可能であることがわかります。
製品RにはIPアドレス変更機能があります。
IPアドレスはOSが管理しているので、製品RのIPアドレスを変更するにはOSと対話する必要があります。そのためシェルに対してIPアドレスを変更するifconfigコマンドを利用することで実現可能です。
よって、スマホからPOSTされたIPアドレス等を製品Rが受け取り、シェル用に加工してから製品Rのシェルへ渡すことで、OSにIPアドレスの変更をさせています。

ifconfig eth1 "192.168.1.181" netmask "255.255.255.0"
このifconfig コマンドのうち、""で囲まれた部分はPOSTによってユーザーから送られた任意の値が入ります。

スマホアプリのデフォルトゲートウェイに ";ping 192.168.1.10; を入れてPOSTを送ると
ifconfig eth1 "192.168.1.181" netmask "";ping 192.168.1.10;"
となります。;を使用することで、1回区切って2個目のコマンドをかけるので

ifconfig eth1 "192.168.1.181" netmask "";
を実行してIPアドレスを変更後

ping 192.168.1.10;
が実行されpingを送信することになります。
pingの部分に他のコマンドを入れれば、シェルで動かすことができる命令なら何でも実行可能なので、外部からOSを好きなように操作できてしまい大変危険です。
これがOSコマンドインジェクションの脆弱性です。


アプリケーションが外部にPOST通信する時はシェルを呼び出して、curlコマンドを利用することで外部にPOSTを送信することも可能ですし、OS側でAPI等シェル以外の方法が用意されているのでシェルを使わずにPOSTを送ることもできます。
そこはプログラムの作り方次第です。

長文でわかりにくかったらすいません…
2025.03.08 13:10
GinSanaさん(No.3) 
SC シルバーマイスター
製品Rに搭載するファームウェアがLinuxベースのOSで、WebアプリRはそのOS上で動作させる

とあるのでどこでコマンドが動作するかと言えばファームウェア(LinuxベースのOS)上です
OSコマンドインジェクションの話をしているので、たとえばネットワーク操作コマンドをJavaEEで動かしているとすれば
var rt = Runtime.getRuntime();
var p = rt.exec("ping -c 1 192.168.1.10");
p.waitFor();
p.destroy();
みたいにやると呼び出せます
>アプリからのリクエストを受け取った製品Rのシェルが、それを馬鹿正直に実行してしまう構造をしているのが問題
ではなく
HTTPリクエストのパラメータのままWebアプリがOSに対する命令を出してしまうから
です
シェルが見境なしに実行するのは当たり前です 正当な指示か違う指示かを判別できるのは指示側です

>アプリケーションが外部にPOST通信する時、これはシェルもカーネル?も使っていない処理なのでしょうか?それともアプリが裏で何らかのシェルとやり取りをしているのでしょうか?

マシンコードになるのでCPU命令そのものでOSに渡したらカーネルもなにもなく動きます
コマンドでカーネルがなんだとか出てくるのは、
シェルが入力からコマンドを解釈して、カーネルにコマンドを実行してと伝え、カーネルが実行し、その実行結果をシェルが受け取るという話から始まっているわけです
シェルが実行するわけでもないのでマシンコードになってませんからまあカーネルを経由してやってもらう必要があるな、というのはなんとなくわかってもらえると思います
深入りしたい場合は
初学者のための正しいシェルとカーネルの概念 ~ 大学も技術者認定機関も間違いだらけ #Linux - Qiita
とかを読んでみてください 話が長いですがまあ役にはたちます
2025.03.08 13:41
 八王子さん(No.4) 
むぐむぐさん、GinSanaさん ありがとうございます。
土日と月曜日で頂いたQiita含め漁ってみましたが、前提知識がなく全く理解が進みませんでした…
シェルの内部コマンドや外部コマンド、シェルにもGUIとCLIがあることなどの理解はしていますが、その先のカーネルやマシンコード?というものが理解できていないと全く話についていけないと気が付きました。

不甲斐ない進捗ですがお礼が言いたく。ありがとうございました。
2025.03.10 22:42
GinSanaさん(No.5) 
SC シルバーマイスター
まあ、プログラミングとかをやったことがないと、どうもピンとこないとかあるとは思いますので、試験優先で、試験が終わってからそのあたりを勉強されていただいてもよろしいかとは思います
深入りすると抜け出しにくくなるとこではありますが、少なくともある程度は知っといた方が絶対いいと思います
2025.03.11 08:36
返信投稿用フォームスパム防止のためにスレッド作成日から40日経過したスレッドへの投稿はできません。
© 2014- 情報処理安全確保支援士ドットコム All Rights Reserved.

Pagetop