アカウント名:
パスワード:
インタプリタ言語とか、スクリプト言語とか、お釈迦様(アセンブラ、C、etc)の手の上で動いているわけで。ハードウェア直に叩くようなネイティブに落ちる言語って全能なんだから脆弱性持たざるを得ないというか、その、「保護機構を記述する言語」なんだからやむを得ないというか、自明だと思う。この言語は脆弱性に強くて堅牢です、なんていうその言語の処理系、自身で記述できるのかと。解決したら(できたら)すごいとは思うが。
最近の言語は基本的に自身で自身のコンパイラが作れるんですが
てかコンパイラって文字列処理とデータ構造の操作とファイルI/Oだけですからね。言語仕様の脆弱性と言語処理系の脆弱性の話がごっちゃになってると思います。
コンパイラなんて乱暴に言えばテキストファイルを読み込んでバイナリファイルを吐き出すだけのバッチフィルターでしょ。最近の言語どころかawkみたいな40年前のインタプリタでも難しくはないはず。
保護機能を無効にするかライブラリを外だしするかでしょ。昔からアセンブリ言語でアセンブラ作れるし。
セルフホスティング・・・というかブートストラッピングの話ですかね?
元コメもだけど、この手の話、言語と実行環境の話がごっちゃになってて良くない。
それぞれの言語が、実行環境さえあれば何でも出来るのは自明。元コメが主張したがってるのは、「その言語の標準的な実行環境が、コンピュータのあらゆる機能を叩けるように作られているかどうか」の話。
C言語の普通の環境なら、「メモリの0番地を書き換える」とか「パソコンの機能を直接呼び出していきなりリブートする」とか、なんでもできる。rootかAdministratorの権限は必要だけど。JavaScriptの普通の環境では、まず不可能。Administrator権限で立ち上げたブラウザ上からでも普通は無理。JavaScriptでCコンパイラを書くことは書ける。「いきなりリブート.c」をコンパイルして機械語の16進数の羅列をブラウザに表示したりはできても、その機械語に実行を移す事はできない。
どうしてもやるなら、JavaScript上から任意の機械語のコードを実行できるプラグインみたいな狂気の代物をブラウザにインストールしておく必要がある。JavaScript用に、「メモリの任意の番地を書き換える、読み出す」とか「CPUのIOを直接叩く」とか…、みたいなライブラリ一式があったら、JavaScriptで書かれたJavaScriptコンパイラでOSを作る、みたいなことももちろん出来るけど、そんなライブラリ一式は無い(…と思う。ネタで作ってる奴が居るかも知れないけど、広く使われるようなのは無い)。
あとまあ、「そういうライブラリをその言語自体で書けるのか」という論点もあるのかな。スクリプト言語ではまず無理。C言語でも無理そうな気がするな。
うぇぶあせんぶりー
あれも名前がカッコイイだけで、超早いJavaScriptでしかないからなぁ。ブラウザのサンドボックスからはみ出てパソコンのメモリを書き換えたりSSDを0で埋め尽くしたりはできない。無限にalertを出す兵庫県警レベルのイタズラ程度が関の山。
WebAssembly ってポータブルなスタックマシンでしょ?ホストCPUの機械語が実行できるわけじゃないよね?
おおっと、LLVM 8.0の宣伝はそこまでだっ!
ちょっとちがうけど、どうせ釣りなんでしょ。
C#ならポインタがあるわけだしまあ何でもできるんでないの所謂広義のインタプリタ系だが
「言語としてなんでもできる」と「処理系としてなんでもできる」のどちらの話なのかを区別しないと議論にならないけど、C#はどちらでもないんじゃないかな。
そもそも、「言語として」で言うと、C言語ですら「なんでも」はできない。
LinuxなんかのOSの全機能を呼び出したいなら、syscall [linuxjm.osdn.jp]関数ぐらいは使えないとダメだけど、これはUNIX系のOSのC言語環境になら入ってるけど、C言語の標準関数ではない。syscallを、その手のC言語としての非標準関数を使わずに呼び出そうとすると64bitのOS + C言語でライブラリを使わずにHello Worldをしてみた [qiita.com]のように、アセンブリ言語の力を借りる必要が出てくる。他にも、CPUのIN/OUT命令ぐらいは呼び出せないと「OSにすら依存しないコンピュータのあらゆる操作」とか「OSそのものの動作」とかは出来ないんだけど、これもC言語の範囲を逸脱する。
あと「なんでも」にも複数解釈の余地があって、「動作が遅くても結果的に出来ればOK」なのか「機械語レベルでCPUを思いのままに扱えないとOKとは言えない」なのか。後者だとすると、SIMD [wikipedia.org]演算をきっちり使って高速化しちゃおう、とか言い出すとC言語では無理。どんどん賢くなってるコンパイラが最適化で上手くやってくれるだろう、と期待するしかない。
で、言語ではなく「処理系」の話だとすると、C言語ではアセンブリ言語の力を借りるのに、アセンブラを使わずC言語の「処理系」だけでできなくもない。
C言語の標準には含まれないけど、色んなコンパイラにインラインアセンブラ [wikipedia.org]の拡張機能が付いているから、それを使うとか。
あるいは、あくまでC言語の標準機能のみでやるんだ、と言うなら、例えば、
char func_str[] = "ここに機械語で書いたサブルーチンを入れる";void (*func)() = (void*)func_str;func();
こういう風にすると、C言語の処理系だけで、機械語のコードを実行できる。未定義動作とかNXビット [wikipedia.org]とかあれこれ問題はあろうけど。とは言えこれは、バッチリ機械語を使っちゃってるので、「C言語処理系の標準準拠の部分のみ」を使ってるけど(未定義動作だから標準からはみ出してるじゃないか、というツッコミもあり得るかな)、「言語として全部純粋にC言語」と主張できるのかどうかは怪しい。
あとまあ、「メモリを自由に書き換えられるなら、適当な関数やらメソッドの中身を書き換えて、任意コードの実行が出来るぜ」という、言語仕様上の脆弱性を突くようなやり口で万能性を主張するというやり口もあり得るかな。
という所まで、掘り下げて何を主張したいのかを明らかにしないと、議論として迷走しかしない。
ということで、C#のポインタは、そこまで万能ではないんじゃないかな。「任意コードの実行」があるいはできるかも?ぐらいじゃないかと。メソッドにポインタからメソッドに変換するような方法があれば別だけど。
ポカをしたプログラムに脆弱性があるのであって、Cに脆弱性があるわけではないと思う。「脆弱性につながるポカをしやすい言語」と言うことなら納得だけれども。
VBやPHPみたいなもんね
そういうことを言い出すと最終的にはアセンブラ・Cも機械語の上で動いているだけとかそういう話に…
さらには機械語もマイクロコードの上で動いているだけという話にメモリアドレスだって仮想アドレスで物理的にどこ指してるか分からないし
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
日々是ハック也 -- あるハードコアバイナリアン
全能性と脆弱堅牢性(ポカヨケ)は両立しない (スコア:1)
インタプリタ言語とか、スクリプト言語とか、お釈迦様(アセンブラ、C、etc)の手の上で動いているわけで。
ハードウェア直に叩くようなネイティブに落ちる言語って全能なんだから
脆弱性持たざるを得ないというか、その、「保護機構を記述する言語」なんだから
やむを得ないというか、自明だと思う。
この言語は脆弱性に強くて堅牢です、なんていうその言語の処理系、自身で記述できるのかと。
解決したら(できたら)すごいとは思うが。
Re: (スコア:0)
最近の言語は基本的に自身で自身のコンパイラが作れるんですが
Re:全能性と脆弱堅牢性(ポカヨケ)は両立しない (スコア:1)
てかコンパイラって文字列処理とデータ構造の操作とファイルI/Oだけですからね。
言語仕様の脆弱性と言語処理系の脆弱性の話がごっちゃになってると思います。
Re: (スコア:0)
コンパイラなんて乱暴に言えばテキストファイルを読み込んでバイナリファイルを吐き出すだけのバッチフィルターでしょ。最近の言語どころかawkみたいな40年前のインタプリタでも難しくはないはず。
Re: (スコア:0)
保護機能を無効にするかライブラリを外だしするかでしょ。
昔からアセンブリ言語でアセンブラ作れるし。
Re: (スコア:0)
セルフホスティング・・・というかブートストラッピングの話ですかね?
Re:全能性と脆弱堅牢性(ポカヨケ)は両立しない (スコア:3, 興味深い)
元コメもだけど、この手の話、言語と実行環境の話がごっちゃになってて良くない。
それぞれの言語が、実行環境さえあれば何でも出来るのは自明。
元コメが主張したがってるのは、「その言語の標準的な実行環境が、コンピュータのあらゆる機能を叩けるように作られているかどうか」の話。
C言語の普通の環境なら、「メモリの0番地を書き換える」とか「パソコンの機能を直接呼び出していきなりリブートする」とか、なんでもできる。rootかAdministratorの権限は必要だけど。
JavaScriptの普通の環境では、まず不可能。Administrator権限で立ち上げたブラウザ上からでも普通は無理。
JavaScriptでCコンパイラを書くことは書ける。「いきなりリブート.c」をコンパイルして機械語の16進数の羅列をブラウザに表示したりはできても、その機械語に実行を移す事はできない。
どうしてもやるなら、JavaScript上から任意の機械語のコードを実行できるプラグインみたいな狂気の代物をブラウザにインストールしておく必要がある。
JavaScript用に、「メモリの任意の番地を書き換える、読み出す」とか「CPUのIOを直接叩く」とか…、みたいなライブラリ一式があったら、JavaScriptで書かれたJavaScriptコンパイラでOSを作る、みたいなことももちろん出来るけど、そんなライブラリ一式は無い(…と思う。ネタで作ってる奴が居るかも知れないけど、広く使われるようなのは無い)。
あとまあ、「そういうライブラリをその言語自体で書けるのか」という論点もあるのかな。スクリプト言語ではまず無理。C言語でも無理そうな気がするな。
Re:全能性と脆弱堅牢性(ポカヨケ)は両立しない (スコア:1)
うぇぶあせんぶりー
Re: (スコア:0)
あれも名前がカッコイイだけで、超早いJavaScriptでしかないからなぁ。ブラウザのサンドボックスからはみ出てパソコンのメモリを書き換えたりSSDを0で埋め尽くしたりはできない。無限にalertを出す兵庫県警レベルのイタズラ程度が関の山。
Re: (スコア:0)
WebAssembly ってポータブルなスタックマシンでしょ?
ホストCPUの機械語が実行できるわけじゃないよね?
Re: (スコア:0)
おおっと、LLVM 8.0の宣伝はそこまでだっ!
Re: (スコア:0)
ちょっとちがうけど、どうせ釣りなんでしょ。
Re: (スコア:0)
C#ならポインタがあるわけだしまあ何でもできるんでないの
所謂広義のインタプリタ系だが
Re:全能性と脆弱堅牢性(ポカヨケ)は両立しない (スコア:1)
「言語としてなんでもできる」と「処理系としてなんでもできる」のどちらの話なのかを区別しないと議論にならないけど、C#はどちらでもないんじゃないかな。
そもそも、「言語として」で言うと、C言語ですら「なんでも」はできない。
LinuxなんかのOSの全機能を呼び出したいなら、syscall [linuxjm.osdn.jp]関数ぐらいは使えないとダメだけど、これはUNIX系のOSのC言語環境になら入ってるけど、C言語の標準関数ではない。syscallを、その手のC言語としての非標準関数を使わずに呼び出そうとすると64bitのOS + C言語でライブラリを使わずにHello Worldをしてみた [qiita.com]のように、アセンブリ言語の力を借りる必要が出てくる。他にも、CPUのIN/OUT命令ぐらいは呼び出せないと「OSにすら依存しないコンピュータのあらゆる操作」とか「OSそのものの動作」とかは出来ないんだけど、これもC言語の範囲を逸脱する。
あと「なんでも」にも複数解釈の余地があって、「動作が遅くても結果的に出来ればOK」なのか「機械語レベルでCPUを思いのままに扱えないとOKとは言えない」なのか。後者だとすると、SIMD [wikipedia.org]演算をきっちり使って高速化しちゃおう、とか言い出すとC言語では無理。どんどん賢くなってるコンパイラが最適化で上手くやってくれるだろう、と期待するしかない。
で、言語ではなく「処理系」の話だとすると、C言語ではアセンブリ言語の力を借りるのに、アセンブラを使わずC言語の「処理系」だけでできなくもない。
C言語の標準には含まれないけど、色んなコンパイラにインラインアセンブラ [wikipedia.org]の拡張機能が付いているから、それを使うとか。
あるいは、あくまでC言語の標準機能のみでやるんだ、と言うなら、例えば、
char func_str[] = "ここに機械語で書いたサブルーチンを入れる";
void (*func)() = (void*)func_str;
func();
こういう風にすると、C言語の処理系だけで、機械語のコードを実行できる。未定義動作とかNXビット [wikipedia.org]とかあれこれ問題はあろうけど。とは言えこれは、バッチリ機械語を使っちゃってるので、「C言語処理系の標準準拠の部分のみ」を使ってるけど(未定義動作だから標準からはみ出してるじゃないか、というツッコミもあり得るかな)、「言語として全部純粋にC言語」と主張できるのかどうかは怪しい。
あとまあ、「メモリを自由に書き換えられるなら、適当な関数やらメソッドの中身を書き換えて、任意コードの実行が出来るぜ」という、言語仕様上の脆弱性を突くようなやり口で万能性を主張するというやり口もあり得るかな。
という所まで、掘り下げて何を主張したいのかを明らかにしないと、議論として迷走しかしない。
ということで、C#のポインタは、そこまで万能ではないんじゃないかな。「任意コードの実行」があるいはできるかも?ぐらいじゃないかと。メソッドにポインタからメソッドに変換するような方法があれば別だけど。
Re: (スコア:0)
ポカをしたプログラムに脆弱性があるのであって、Cに脆弱性があるわけではないと思う。
「脆弱性につながるポカをしやすい言語」と言うことなら納得だけれども。
Re: (スコア:0)
VBやPHPみたいなもんね
Re: (スコア:0)
そういうことを言い出すと最終的にはアセンブラ・Cも機械語の上で動いているだけとかそういう話に…
Re: (スコア:0)
さらには機械語もマイクロコードの上で動いているだけという話に
メモリアドレスだって仮想アドレスで物理的にどこ指してるか分からないし