パスワードを忘れた? アカウント作成
この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。

「脆弱性の多いプログラミング言語」ランキング、C言語が大差で1位に」記事へのコメント

  • インタプリタ言語とか、スクリプト言語とか、お釈迦様(アセンブラ、C、etc)の手の上で動いているわけで。
    ハードウェア直に叩くようなネイティブに落ちる言語って全能なんだから
    脆弱性持たざるを得ないというか、その、「保護機構を記述する言語」なんだから
    やむを得ないというか、自明だと思う。
    この言語は脆弱性に強くて堅牢です、なんていうその言語の処理系、自身で記述できるのかと。
    解決したら(できたら)すごいとは思うが。

    • by Anonymous Coward

      セルフホスティング・・・というかブートストラッピングの話ですかね?

      • by Anonymous Coward on 2019年03月29日 15時53分 (#3589896)

        元コメもだけど、この手の話、言語と実行環境の話がごっちゃになってて良くない。

        それぞれの言語が、実行環境さえあれば何でも出来るのは自明。
        元コメが主張したがってるのは、「その言語の標準的な実行環境が、コンピュータのあらゆる機能を叩けるように作られているかどうか」の話。

        C言語の普通の環境なら、「メモリの0番地を書き換える」とか「パソコンの機能を直接呼び出していきなりリブートする」とか、なんでもできる。rootかAdministratorの権限は必要だけど。
        JavaScriptの普通の環境では、まず不可能。Administrator権限で立ち上げたブラウザ上からでも普通は無理。
        JavaScriptでCコンパイラを書くことは書ける。「いきなりリブート.c」をコンパイルして機械語の16進数の羅列をブラウザに表示したりはできても、その機械語に実行を移す事はできない。

        どうしてもやるなら、JavaScript上から任意の機械語のコードを実行できるプラグインみたいな狂気の代物をブラウザにインストールしておく必要がある。
        JavaScript用に、「メモリの任意の番地を書き換える、読み出す」とか「CPUのIOを直接叩く」とか…、みたいなライブラリ一式があったら、JavaScriptで書かれたJavaScriptコンパイラでOSを作る、みたいなことももちろん出来るけど、そんなライブラリ一式は無い(…と思う。ネタで作ってる奴が居るかも知れないけど、広く使われるようなのは無い)。

        あとまあ、「そういうライブラリをその言語自体で書けるのか」という論点もあるのかな。スクリプト言語ではまず無理。C言語でも無理そうな気がするな。

        親コメント
        • by Anonymous Coward on 2019年03月29日 15時58分 (#3589900)

          うぇぶあせんぶりー

          親コメント
          • by Anonymous Coward

            あれも名前がカッコイイだけで、超早いJavaScriptでしかないからなぁ。ブラウザのサンドボックスからはみ出てパソコンのメモリを書き換えたりSSDを0で埋め尽くしたりはできない。無限にalertを出す兵庫県警レベルのイタズラ程度が関の山。

          • by Anonymous Coward

            WebAssembly ってポータブルなスタックマシンでしょ?
            ホストCPUの機械語が実行できるわけじゃないよね?

          • by Anonymous Coward

            おおっと、LLVM 8.0の宣伝はそこまでだっ!

        • by Anonymous Coward

          ちょっとちがうけど、どうせ釣りなんでしょ。

        • by Anonymous Coward

          C#ならポインタがあるわけだしまあ何でもできるんでないの
          所謂広義のインタプリタ系だが

          • by Anonymous Coward on 2019年03月30日 11時16分 (#3590384)

            「言語としてなんでもできる」と「処理系としてなんでもできる」のどちらの話なのかを区別しないと議論にならないけど、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#のポインタは、そこまで万能ではないんじゃないかな。「任意コードの実行」があるいはできるかも?ぐらいじゃないかと。メソッドにポインタからメソッドに変換するような方法があれば別だけど。

            親コメント

日本発のオープンソースソフトウェアは42件 -- ある官僚

処理中...