【プログラミング】「IE」に対する最新攻撃の原因は、たった1文字のタイプミスが原因〔07/30〕
1 :
(^o^)ノ<進めーψ ★:
7月上旬以降、「Internet Explorer(IE)」を攻撃の脅威にさらしている同ブラウザのセキュリティホールは、
Microsoftによるコード内のたった1つのタイプミスによって引き起こされていた。
Howard氏はブログで、ハイテク版「ウォーリーをさがせ!」さながらに、読者が数行の短いコードの中から
タイプミスを見つけられるかを試した。Howard氏は、タイプミスは1文字だというヒントまで出している。
Howard氏が読者に提示したコードは、以下の通りだ。
__int64 cbSize;
hr = pStream->Read((void*) &cbSize, sizeof(cbSize), NULL);
BYTE *pbArray;
HRESULT hr = SafeArrayAccessData(psa, reinterpret_cast(&pbArray));
hr = pStream->Read((void*)&pbArray, (ULONG)cbSize, NULL);
そして、Howard氏は読者に次のように出題した。「もう1つ手がかりをだそう。タイプミスは1文字だ。
降参だろうか。では、最後の1行を見てもらいたい。最初の引数が間違っている。正しくは、
『hr = pStream->Read((void*)pbArray, (ULONG)cbSize, NULL);』だ」(Howard氏)
このセキュリティホールは7月、ドイツの2人の研究者によって発見された。Zynamics GmbHの最高
経営責任者(CEO)であるThomas Dullien氏(Halvar Flake氏としても知られている)とその友人である
Dennis Elser氏はブログの中で、発見について詳しく説明した。両氏はこの脆弱性が明らかになった後、
コードを精査し、不必要な「&」の文字があることに気付いた。
Microsoftは、タイプミスを防ぐために、今後どのような対策を講じるのだろうか。
Howard氏はブログの中で、Microsoftのコーディングプロセスを整理する必要性を認めている。
Howard氏によると、 Microsoftはこうした間違いを発見するのに使うツールをアップデートするという。
さらに、Microsoftはプログラマーに対し、新しいATL コードを使用することを求める予定だ。
http://japan.cnet.com/news/sec/story/0,2000056024,20397505,00.htm 関連スレ 過去に類を見ないほど“怖い”脆弱性、MSがパッチを緊急リリース
http://pc11.2ch.net/test/read.cgi/pcnews/1248869819/
> Microsoftは、タイプミスを防ぐために、今後どのような対策を講じるのだろうか。
C#でも使うんじゃね?
ポインタなんてものがあったり、そういうキャストが必要だったり、
それで動いてしまうのがC/C++という言語の大きな欠点だから。
ポインタとか堂々と使ってる時点でエラーが混入するのはあたりまえ。
いい加減開発環境見直せよww
プログラマってこういうミスよくやるもんなの?
5 :
名無しさん@お腹いっぱい。:2009/07/30(木) 20:32:04 ID:wBscWi0A
ハンガリアン記法の意味が全くないよなこれw
これが、MSクオリティ
>>4 ものすごく多い
ほとんどはコンパイルエラーで弾かれるし、ここスルーしてもデバックで見つかる
プログラマにとってコードは文章で誤字脱字は日常茶飯事
かえってこのレベルに達しない初級プログラマの方がコーディングは正確だよ
>>4 構文レベルのミス
期待通りの動作をしないミス
期待通りの動作をするが、予想外の事態も発生するミス
一番見つけづらいのが最後で、今回もこれが原因
> ((void*)&pbArray
これは、コンパイルエラーも警告もでないからなぁ。
普通なら、なぜか落ちる。など不具合が表面化するんだけど、
これはBYTE型(1バイト)だから、たまたま落ちる可能性も少ない。
プログラム言語の問題でもあるから、C++を使うのをやめるぐらいしか手は無いんじゃね?
10 :
名無しさん@お腹いっぱい。:2009/07/30(木) 21:15:24 ID:wBscWi0A
今回に限ってバグの原因を公開したのは、ポインタに泣かされた経験のあるプログラマに
「こりゃあ仕方ないわw」って同情して貰うことを期待したから?
いや、こんな誰もが犯したことがある仕方が無いレベルの問題を
ツールで解決してみせるって自信があるんだろう?
12 :
名無しさん@お腹いっぱい。:2009/07/30(木) 21:23:45 ID:SCanjDjx
matlabで a*b と a.*b を間違えたらエロイ事になる。
hr = pStream->Read((void*) &cbSize, sizeof(cbSize), NULL);
cbSizeのアドレス渡してるじゃん
>>7 ソニーのロボットのソースが10万行って聞いてびっくりしたけど
1000行が100個って考えたらそこまで多くない気がしたけど
その膨大な量のデバッグ考えたらおてぃんてぃん
>>13 cbSizeは64ビット整数だからいいんだよ
pbArrayは頭文字がpで、ポインタと一目で分かるようになってるのに&付けちゃった
みなさん、すごい仕事に携わってるんだなぁ。
おりには全く理解できないや OTL
人間の修理の仕事でよかったよ。
で、
>>1の間違いに気がついた人たちはどれぐらいいるの?
このスレ見ているやつは全員1秒くらいで分かっただろ。
たった一文字って聞いた時点で、
*か&だろうなとは思った。
20 :
名無しさん@お腹いっぱい。:2009/07/31(金) 00:17:58 ID:rrl1epH2
一瞬、何かの入力が1文字違うとバグになる様なコードと思って、
最初の2行目までしか見てなくて、メンバ関数の仕様が分からんからわからねーとおもったら、
なんてことはない、単にポインタを渡すべきところを、ポインタのアドレスを渡していたのね。
1文字のタイプミスっていうのに納得。日本語の勉強が必要だ。
>>21 またMac信者が暴れてる。
キツネと違ってまともな記者なんだからお前の勝手な都合で叩くなよ。
>>7 「タイプミスはよくあること」
と実例を示す君に感動した。
構文のチェックツール使ってないのか?
型チェックとかうるさいほど言ってくるぞw
ポインタってややこしいからなるべく使わないようにコーディングしたいがWinのAPIが使いまくりだから困る
ポインタ+キャストのコンボは正直虐めだ…。
大嫌いなのに使わざるを得ない場面が多々あるってのがC++クオリティだね
仕事でもねぇ限り他人のソースなんか見るのも嫌だ。
31 :
名無しさん@お腹いっぱい。:2009/08/01(土) 15:00:47 ID:/zUkDmyB
マイクロソフトはセキュリティーソフトを作る企業を守るため
わざわざセキュリティーホールを設定しているんだよ
そうか。じゃあ、他のOSのセキュリティホールも
同じ理由だな。
>>25 > 構文のチェックツール使ってないのか?
> 型チェックとかうるさいほど言ってくるぞw
お前は素人かよ。もとのソースコード読んだか。
これは警告が出ない類のキャストだろ。
>>26 > ポインタってややこしいからなるべく使わないようにコーディングしたいがWinのAPIが使いまくりだから困る
これはどちらかというと、C言語の問題。
Linuxであっても同じようなことはおきるさ。
BYTE *pbArray;
を
void *pbArray;
にしたほうが良かったんじゃないか?
コードを見直さないMicrosoftが悪い。
この手の類はイヤというほど見直すはず。
最近はポインタなんかいじらなくても自動でメモリ確保してくれたり便利なのがあるんでしょ?
37 :
名無しさん@お腹いっぱい。:2009/08/06(木) 21:35:11 ID:56riYvTO
>34
なんか違うんでないか??
BYTE *pbArray;
を
BYTE bArray;
なら意味わかるけど・・・
MS社推奨なのは、型と意識するため
BYTE *変数名→BYTE* 変数名のように書けとどこかにあったと思う(14〜5年前)
>>37 BYTE bArray;
はないだろ。
SafeArrayAccessDataという関数は良く知らないが、pbArrayに関数内で確保した
メモリのアドレスを設定して、pStream->Readでデータを読み込んでるようにしか見えないからな。
HRESULT hr = ...
の前の行で hr を使ってるんですが...
>>38 なるほど、あくまでもポインタ利用に使われているだけですな
そう考えるとvoid*とした方が良いわ
っつーか、俺もそうすると思う
マイクロソフトのミスは奇麗なミス
>>36 だからこそ、その1箇所が残ったんじゃないか?
マルエツドザの憂鬱
最近良いニュースが多いな
46 :
名無しさん@お腹いっぱい。:2009/08/23(日) 08:54:55 ID:7S1y0osk
MSってソースコード公開してるの?
してるよ。政府や大学など一部の人に限られているけど。
>>36 ガベコレのおかけで、メモリの開放を気にしなくてよくなるハズだったけど、
実際には循環参照やら、スコープの関係で参照が残ったりして、メモリリークが多発するようになった。
その場合は、きちんとオブジェクトのスコープとエクステンドを考えて、明示的にnullを代入してやればいいんだけど、
それがスゲーめんどくさい。質の悪いパズルをといているみたいで、頭がクラクラしてくる。
だから、どんな時もメモリが不必要になったらとりあえず、null突っ込むようにするのが安全策。
でもそれって、ガベコレ以前の状態に戻っただけなんだよね。
>>49 循環参照などが発生する場合だけ
気をつければよくなっただろ。
だいたあるクラスAがBに依存していながら、
BもAに依存するという設計がそもそもおかしい。
これは俺もやったことがある。
>>50 その「気をつける」のが負担なんだよ。
単純にプログラム作ってる分にはいいけど、たとえば、
「クロージャの中で生成した無名クラスのスコープが呼び出し先になっていって、参照が残っている」
みたいな事言われてもワケワカラんだろ。
よく考えれば、確かにその通りなんだけど、そういった複雑な事はあんまり考えたくないという事さ。
>>52 オブジェクト指向がまだわかってませんって言えよ
一つだけ気をつけるのが苦痛なら、
全部気をつけるのはもっと苦痛なはずだが?
おっさんほどオブジェクト指向が出来ましぇんw
>>57 すいません、漏れはオブジェクト指向がよくわからないので、
どうして、52の状況でどうしてメモリリークが起きるの教えてください。
お願いします(w
>>53 ガベージコレクションみたいなコンパイラ依存の強い部分の問題を、
設計で回避できるオマエって天才じゃね?
>>59 あほかw
循環参照を避けろっていってんだよ。
>>60 だから、循環参照しているかどうかは、すぐには判りづらくてめんどうだね
って話なんだろうが。
GUIでリスナかませたりしたら、コンパイラやらインタプリタの実装によっては意図しない循環参照がおきたりするんだが、
そんな、コンパイラやらインタプリタやらの実装まで考慮にいれた設計技法ってなんなのよ。
それは「設計」じゃなくて「コーディング」だと思うのだが。
GCの話をしているのにいきなりOOPがどうとか言うバカもいるしな。
俺はもう撤退するわ。
>>61 お前がアフォなだけだろ。
そもそもだな。循環参照が発生する。それはGCじゃなくても発生する話だろうが。
循環参照が発生するから、GCは大変だとか、意味不明なんだよ。
別にGCだから循環参照が発生するようになったわけじゃないだろうが。
> オブジェクト指向って自慢できるような事?
いや、ただの常識。誰も自慢なんかしていないが、
そんなの常識をいちいち気にしているようじゃ、まだまだだね。
ガーベッジコレクションは非常に便利だが、
さすがに数十GBのメモリを扱う場合は解放しないと暴走するからなぁ・・・
軽さとコーディングの簡単さと互換性をとると、C#かJavaかPHPだな
65 :
名無しさん@お腹いっぱい。:2009/08/24(月) 13:42:13 ID:eM6BxoD8
タイプミスがどーのって話じゃなく、単にちゃんとテストしようよって話だわな。
ウィンドウズアプリって、あまりテストコード書かないの?
hr = pStream->Read((void*)&pbArray, (ULONG)cbSize, NULL);
『hr = pStream->Read((void*)pbArray, (ULONG)cbSize, NULL);』
つーか、違いは 『 と 』 で2文字だろ?
プログラミングの世界だとこれを1文字扱いなのかいな。『と』で対だから?
えっ
ぬるぽ
どっ
たしかに、よくわかってもいないのに、オブジェクト指向とか連呼する困った御仁は、どこにでもいるよな。
いちいち、オブジェクト指向という言葉に反応するやつも、死んでほしい。
俺に言わせれば、if文、switch文とレベルの話でしかなく。
ifでできるが、switchでやったほうがわかりやすいからswitchを使うのと同じく、
普通にここはオブジェクト指向でやった方がいいなという感覚で使っているだけなのだが。
いちいち、下らん考えを持ち出さないでほしい。
比較などして決める問題じゃない。自然の流れで決まるのだから。
>>64 カベージコレクションからいきなりオブジェクト指向の話を持ち出しているところをみると、
オブジェクト指向 = メモリを自動的に解放してくれるみたいな風潮でもあるのだろうか?
73 :
72:2009/08/25(火) 19:01:09 ID:???
>64じゃなくて>70でしたスマン。
>>72 ”自分が知らないもの” というくくりをしているから、
全部同じに見えちゃうんじゃない?
もしくは、”自分が昔あんなに苦労したのに、楽なものを使うな” というくくりかもしれないw
ガーベジコレクションな。
Garbage Collectionをどう読めば「ガベージコレクション」になるんだ?
カタカナ読みってそんなもん。
ビニールって英語で言ってみな。
また不具合か
Appleのようだ
81 :
名無しさん@お腹いっぱい。:2009/09/06(日) 06:50:10 ID:41k70lkV
不具合に関してMicrosoftはAppleを越えた
82 :
名無しさん@お腹いっぱい。:2009/09/06(日) 13:24:46 ID:IprVXARS
リターンコードを検査してないない事にはノーリアクション?
こんなコードが何百万行もあったら、そりゃ動かなくなるわけだ。
void型のポインタなんて潜在的なエラーを起こす大きな原因なんだから
使わないほうがいいんじゃね?などと
>>34を見て思った俺は馬鹿だろうか・・。
まんこ丸見えではありませんか?
ただしMacには64bit化されたソフトが無い
>>86 嘘はやめとけ
今まで以上に信用されなくなる
>>14 > ソニーのロボットのソースが10万行って聞いてびっくりしたけど
> 1000行が100個って考えたらそこまで多くない気がしたけど
> その膨大な量のデバッグ考えたらおてぃんてぃん
よく言われるのが、平均的なプログラマ一人が1ヶ月間で
コードを作成し、まともなデバッグをして開発できるステップ数は2000ステップだそうだ。
つまり、2Kステップだ。
とすると、10万行=100キロステップは、プログラマ50人月。
設計が完全に完了していることが前提だが、
10人のプログラマで5ヶ月かかる寸法だ。
また不具合?
90 :
名無しさん@お腹いっぱい。:2009/09/24(木) 09:34:41 ID:5UsZ7z7s
これって読み込むサイズによっては正常にすら動かないんじゃね?
>>2 C#ってソースコード丸見えと聞いたが
実際はどうなんだろう?
92 :
名無しさん@お腹いっぱい。:2009/09/25(金) 00:46:52 ID:6qRo+Q7U
FORTRANで
DO 10 I=1.100
の話を連想した
ほんとC#ってJavaのパクリだもんなw
マイクロソフトはいつもパクり
マカはスレを荒らすな
マルエツドザが必死に書き込むよ
↓
マルエツのアルバイトやってるけど、どうかしたの?
お馬鹿Mac信者がマルエツ連呼するようになるまでの流れ
255 :名無しさん@お腹いっぱい。:2009/06/22(月) 01:44:13 ID:???
マカーはユニクロ好きそう
257 :名無しさん@お腹いっぱい。:2009/06/22(月) 23:00:09 ID:???
>>255 ドザはマルエツだろ?
258 :名無しさん@お腹いっぱい。:2009/06/22(月) 23:40:48 ID:???
マルエツって服売ってんの?
264 :名無しさん@お腹いっぱい。:2009/06/24(水) 02:23:19 ID:???
マルエツで服が買える事を知ってるのかマカは。
つまり、いつもそこで…
272 :名無しさん@お腹いっぱい。:2009/06/25(木) 11:20:42 ID:???
ユニクロに対してマルエツwww
273 :名無しさん@お腹いっぱい。:2009/06/25(木) 12:32:56 ID:???
マルエツは関東ローカルなスーパーで、必ず服が置いてある訳でもない、とw
こーいう煽りは、全国展開していて、それなりに認知されてる店じゃないと駄目だろw
279 :名無しさん@お腹いっぱい。:2009/06/27(土) 09:07:18 ID:???
>>257でマルエツなんて言い出さなければマカがここまで長々と
馬鹿にされ続けることも無かっただろうに。
マルエツドザの必死さが伺われますねwww
そっちのマルエツか……
>>99はなかった事にしといてくれorz
あの字使ってるスレがドザ板にあったなw
そんなところで間違えて覚えたのかwww
IEって弱いねw
Safariはもっと弱いけどw
キャストが必要となるAPIというのが問題なんじゃまいか?
キャストが無ければ、型チェックで検出できるだろうし
キャストが必要ないAPIっていうのは
拡張性がないってことなんだよ。
新たな型に対応できないってことだから。
新たな型を作るたびにAPI増やすつもり?