トップ 最新の日記 ユーザー登録 ログイン ヘルプ

osdev-jの日記 RSSフィード

2008-05-15

debianとかUbuntuのOpenSSLにおける脆弱性 06:01  debianとかUbuntuのOpenSSLにおける脆弱性 - osdev-jの日記 を含むブックマーク

重要なのは、この問題は全てのSSHユーザが気にしなければならない点。今まで接続したホストにdebianやUbuntuが含まれていないだろうか?

http://www.debian.or.jp/blog/openssl_package_and_its_vulnerability.html

これは画期的に危ない。

仮にdebianとかUbuntuなマシンを外に出していなかったとしても、debianとかUbuntuで生成された鍵を信頼しているマシンすべてが危ないので実はOSを問わない。

要するに、

  • .ssh/authorized_keysにdebianかUbuntuのマシンで作った公開鍵がある

と、侵入を許す危険がある。もちろんこのリストは完全でなくて、他にもOpenVPNのようなOpenSSLの暗号機能を使ったアプリケーション全部が該当する。

known_hostsに有るのも不味い気がするが、どのくらい不味いのかはちょっとわからない。。仮に(脆弱な)debianホストのふりをする場合、ホスト名を乗っ取る必要もあるのでauthorized_keysに書いてある鍵に対する攻撃よりも敷居は高い。

これは鍵ペアの問題なのでパスフレーズとかは関係が無い。

教訓は何なのか

まぁ、そういうのは方々で注意喚起が出るはずなので、重要なのは教訓を得ること。

http://metasploit.com/users/hdm/tools/debian-openssl/

要するにPRNGのエントロピ源がPIDだけになっていたというのが基本的な問題。

こういう問題を見過ごさないためにはどうすればいいんだろうか。ディストリビューション独自のパッチには気を付けた方が良いのかも知れない。

こういう問題を含めてしまう程度に複雑化したフローを持っているのは黄信号という考えかたも出来る。そもそも未初期化領域をエントロピ源として使用する必要があるのか とか。。違うらしい。

教訓 : 大変な問題は知らない間に起こる。

あんまり自分の使ってるOSとかを宣伝しない方が良いんだろうか。身の回りに結構debianやUbuntuのユーザは思い当たる。

大変 06:01 大変 - osdev-jの日記 を含むブックマーク

こんなことしてる暇あるのかと訊かれると困る。

耳の位置に悩む。物理的に自然(?)な方が良いかなという気持ちはある。

USB小ネタ

  • HUBのLEDは複数有るなら個別に点灯/消灯できる。
  • USBのHUBはEthernet的に言うとバカHUBなので、関係無い通信でも全部のポートに流している。ただしLow-Speedは別。
  • Windowsはシャットダウン中に特定のUSBデバイス*1を抜くと死ぬ。
  • 不正な応答を返すUSBデバイスでも死ぬ。
  • ドライバのインストール中に黙っても死ぬ。

どこのOSも行儀の悪いUSBデバイスには弱いのであんまり虐めるのはやめてね。

というわけで、

相性問題が超厳しいのでUSBロースピードデバイスのサポートを見送り気味。。Bluetoothあれば要らないし。。*2

というわけで完成が近づきつつ。あと1ヶ月くらいでゲームオーバーかどうか決定する感じ。

なんでプロトコルの本なのにCPUからやってんのかみたいな疑問もあるけど、「コンピュータの気持ちになる」のは重要。だと思う。

当初は手作りワークステーションで始まったプロジェクトが、諸般の事情でマイコンになりつつあるのは悲しい。。まぁ物理的にはSUN位の性能はあるけど、解説を簡単にするために全部をインタプリタにしたので。。その辺は後ほど。

*1:Bluetoothとか無線LANは結構高確率

*2:多分アップデートで対応します。何クロックのwaitを許容するかみたいな問題なので。

トラックバック - http://osdevj.g.hatena.ne.jp/osdevj/20080515

2008-04-19

遠回りしがち 07:32 遠回りしがち - osdev-jの日記 を含むブックマーク

発作的にタイツ描きたくなった。

mdiappが着実にバージョンアップしてデバッグされているのは喜ばしいのだけど、無くなって寂しいバグもある。

今まで、ブラシコントロールはクリックするたびに一定位置に戻るという問題が有ったので、極端に大きなブラシを作るときに、ブラシパレットをクリック→大きくする→パレットをクリック→大きくする の繰り返しで何処までも大きいブラシを作ることが出来た。

冷静に考えると、そんなことをするよりもダイアログ出して数字を入力した方が良いに決まってるのだが、ペンを持ち替えるのが面倒なのでついついやってしまう。

こういう、小さな労力(や、画面切り替えのストレス)を節約するわりに無駄な時間の掛かる操作を人間はついついやってしまうような気がする。

やりがちな無駄操作の例

人間は破壊的動作を可能な限り避ける習性があるのではないだろうか。

  • ショートカット作ればいいのに作らないでいちいちフォルダ階層を辿る
  • WebサイトをブックマークすりゃいいのにGoogleから行く
  • 単語登録すりゃいいのにIMEが覚えてくれるまで頑張る
  • 一旦切り取りすれば良いのにドラッグで頑張って遠くのwindowに移動

特にWebサイトをブックマークしないひとって結構いると思うんだけど。。タブブラウザのタブに溜めておくとか。

お絵かきソフトの謎

日頃から、一般的なお絵かきソフトの類のUIで疑問に思っているのは色々とある。

  • 何故最初にサイズを決めるのか
    • テキストに例えると、最初にサイズ決める→ワープロ、サイズ決めない→エディタ。
    • そう考えると、世間のお絵かきソフトの殆どは当然ワープロ。紙に出力するのが大きな目的であるからだが、そうでない用途もあるのではないか。
  • 何故ステートの切り替えをワンタッチで出来るようにしないのか
    • 物理的なペンや筆は持ち変えるという一つの動作で全てのステートを保存し、復帰することが出来る。
    • 大抵のアプリはビューポートを一つ、または全体を見渡すナビと編集windowしか持たない。「左右反転した特定部位のズーム」を行うために必要な操作は2つ以上であることが多い。
    • 要するに、一般的なツールパレットはステートの「素材」でしかない。真のステートはより横断的。
  • 何故カーブの適用が分離しているのか
    • 筆圧カーブ、グラデーション、レイヤ合成、etc..のカーブやその設定インターフェースはすべて独立していることが多い。
    • 本来的には一つで良いし、グラデーションで出来ることが筆圧カーブで出来なかったりする。

最初のが典型的だけど、要するにこれらは「伝統的なデザインを踏襲したらこうなった」のであって、大多数の人間にとって、CGソフトというのはこういうのが自然であるといえる。

しかし、普段プログラミングとか作曲をしていて、急にお絵かきソフトのUIに触れるとかなり違和感がある。と、思う。そこに順応するのが正しいことなのかどうかはわからないけど。

[] Bluetoothデバイスを切り替え器ごしに共有する 02:05  Bluetoothデバイスを切り替え器ごしに共有する - osdev-jの日記 を含むブックマーク

ついカッとなってApple Wireless Keyboardなるものを買ってしまった。

まぁまぁ快適で満足しているが、VGAUSBを頻繁に切り替えるライフスタイルには合わない。これを不正なテクニックを駆使してどうにかする。

何が問題なのか

Bluetoothにはビルトインのセキュリティメカニズムが存在する。すなわち、PINコードによって暗号化されたリンク鍵(link key)を交換し、通信路を暗号化することができる。

このリンク鍵の交換はペアリングと呼ばれる。

通常のBluetooth周辺機器はリンク鍵を一つだけ不揮発メモリに保持することによって、毎回ペアリングを行うことを防いでいるが、複数台のPCと同時にペアリングされることは大抵の場合考慮されていない*1

しかし、そのような仕様のデバイスであっても、いくつかの条件を満たせば、複数台のPCと切り替えて使える。

  • 接続先のBluetoothアドレス(MACアドレス)が一定
  • リンク鍵を共有する

最初の条件はPC側で使用するBluetoothアダプタを共有することで達成できる。すなわち、Bluetoothアダプタを切り替え器に付けて、Bluetoothアダプタごと切り替えてしまえば良い。

後者の条件はあまり単純には行かない。

リンク鍵の抽出(LinuxのBlueZの場合)

単純に、/var/lib/bluetooth/(アダプタのBluetoothアドレス)/linkkeysファイルにテキストファイルとしてストアされる。

リンク鍵の抽出(Windowsの標準Bluetoothスタックの場合)

話は少々複雑となる。

リンク鍵はレジストリ中のHKLM\SYSTEM\CurrentControlSet\Services\BTHPORT\Parameters\Keysに格納されているが、これは通常の方法では読みだすのが面倒である。

今回はマルウェアスキャナのcatchmeを使用(catchme -s)し、ダンプした。

128bitのリンク鍵が確認できる。

手順

今回は、Linux(gentoo)マシンとWindows VistaマシンをUSB VGA切り替え器に接続し、Apple Wireless Keyboardを接続した。

  1. 両方のマシンで通常のペアリング操作を行う*2
  2. Windows側のリンク鍵を抽出
  3. Linux側のリンク鍵(/var/lib/bluetooth/[ADDR]/linkkeys)を書き換え

逆の手順(Windowsのリンク鍵をLinuxに合わせる)はあまり容易ではない。

これは実際に機能するが、切り替えにはおよそ20秒程度掛るため、使用方法によってはSynergyのようなソフトウェア的な手法による共有を検討するべきだろう。

*1:複数個の鍵を持てる機種も存在する

*2:BlueZはリンク鍵を消さないと異るリンク鍵を要求するデバイスを接続出来無いようだ。

トラックバック - http://osdevj.g.hatena.ne.jp/osdevj/20080419

2008-03-31

CPUのデザイン 10:59 CPUのデザイン - osdev-jの日記 を含むブックマーク

結局、この1週間に4つほどCPUを作って、最終的なデザインを決めた。まぁ要するに、0オペランド~3オペランドの4つな訳だけど。。

実はこの辺のデザインはあんまりFPGAの回路規模に影響を及ぼさなくて*1、便利な命令を増やせば実際の処理を行う部分がどんどん肥大化して殆どを占めることになる。

ぶっちゃけバレルシフタ*2が一番でかい。(書き方が悪いのかも)

普段はx86に文句たらたらなのに、イザ自分で命令セットを設計するとハードウェアに優しい命令ばかりになるのは非常にどうかと思う。。

当初は、非常に制限されたCPUを6つ並べて、USBVGAをソフトウェアで実行していた*3。それは不評だったのでワイヤードロジックに書き換えたけど、ギャグとしてはCPUを並べたほうがずっと面白いのでなかなか悩ましい。

仮想マシンがスタックマシンである必要性

を読むと書こうとしていたことが大体書いてあるので、その辺は省略。

それでも、個人的に良いと思っているのは、無限個のレジスタを仮定した中間コードで、LLVMの標準中間言語やDisはこの形式。

どこまでを明示的にして、どこまでを暗黙のうちに処理するかというのは非常に微妙なバランス感覚で、たとえば、CellSPEは自動的なキャッシュじゃなくてソフトウェアで処理するという方法論を選んだわけだけど、どの程度性能的に有利なのかというと微妙な問題としか言いようがない*4

というわけで、スタックマシンの方が良いパターンとレジスタマシンの方が良いパターンってのは多分両方あって、どういうときにどっちなのかを考えてから言語環境を作るべきなのかな。と思った。

FPGAと真理値表 10:16 FPGAと真理値表 - osdev-jの日記 を含むブックマーク

IC設計ごっことしては、やっぱり、フロアプラン*5が出るとそれっぽいかなぁとふと思った。

元々、Xilinx ISEにはアプリケーションとしてFloorPlannerが存在して、それを見ることでFPGAのどの領域がどの機能に使われているとか解る。しかし、本の図にするにはかなり解像度が足りないし、解りづらい。

つまり、同様の作画をするアプリケーションを自作する必要がある。

問題は、普通のコンパイラと違って、論理合成ツールの中間ファイルは規格化されていない*6ので、通常の手段では中間ファイルをパースして動作するようなソフトを作ることが出来ない点。

そこで、たぶん正攻法じゃないけどシミュレーションモデルを流用することとした*7

ISEから、「Place & Route」→「Generate Post Place & Route Simulation Model」を実行すると、こんなのが書いてあるVHDLファイルが出来る。

 \i_usbp/PB_o_17_mux00001\ : X_LUT4
  generic map(
    INIT => X"ECA0",
    LOC => "SLICE_X4Y4"
  )
  port map (
    ADR0 => \i_usbp/PB_o\(17),
    ADR1 => \i_usbp/usb_eb_mi_out\(17),
    ADR2 => \i_usbp/N0\,
    ADR3 => \i_usbp/N1\,
    O => \i_usbp/PB_o_17_mux0000\
  );

(LUTはLook Up Tableの略。FPGAはLUTで回路を作る → http://monoist.atmarkit.co.jp/fembedded/special/fpga/fpga02.html)

これは本来、VHDLを実行するソフト  つまりシミュレータで結果を確認するためのソースコードなので、FPGAの内部状態を通常の人間が満足する程度には再現するだけの情報を含んでいることになる。

↑に抜き出した部分はUSBスニファモジュールの一部分で、平たく言えばPB_oかusb_eb_mi_outを選んで出すという部分。実際、ECA0は1110110010100000で、これを並び替えると、

  • (左から順に、N1 N0 usb_eb_mi_out PB_o => 出力)
  • 1111 => 1
  • 0111 => 1
  • 1011 => 1
  • 0011 => 0
  • 1101 => 1
  • 0101 => 1
  • 1001 => 0
  • 0001 => 0
  • 1110 => 1
  • 0110 => 0
  • 1010 => 1
  • 0010 => 0
  • 1100 => 0
  • 0100 => 0
  • 1000 => 0
  • 0000 => 0

となり、いわば、

if (N1 == 1) {
 output = usb_eb_mi_out;
}else if(N0 == 1){
 output = PB_o;
}else{
 output = 0;
}

を表していることが解る。

逆に言えば、↑のC(疑似)コードを受け取ってLUTの16bitに押し込めるツールを作ればFPGAをプログラミングできる気がしてくる*8。実際には非常に面倒な問題が山積みなので止めといた方が身のためだと思うが。。

*1:0オペランドとか1オペランドだと本気で小さくする気になればかなり小さくできるが。。例えばZPU( http://www.zylin.com/zpu.htm ) はGCCも移植されてるスタックマシン型のCPUで、かなり小さく実装できる。

*2:シフト命令を実行する部分

*3:Parallax Propellerのパクり http://en.wikipedia.org/wiki/Parallax_Propeller

*4:他にも、MMUを使うのかsoftware isolated processにするのか、命令セットをCISCにしてRISCコアで実行するのか、RISCにするのか、VLIWにするのか つまりPentium vs MIPS vs Crusoe等いくらでも。

*5ICの一部分と機能ブロックを対応づけた物。こういう奴 : http://www.realworldtech.com/page.cfm?ArticleID=rwt090406012516&p=4

*6:普通のコンパイラならELFなりPEというオブジェクトファイル形式が有るのでそれを使えばいい

*7:正攻法募集中

*8http://www.geocities.jp/kwhr0/hard/mips.html のKX_MIPSのようにLUTのようなプリミティブを並べたブツを作るというのが入り口としては適切か。。?

JamloagsJamloags2017/05/16 05:59Acheter Le Levitra How Much Does Cialis Cost Amoxicillin Msds <a href=http://byuvaigranonile.com>viagra</a> Viagra E Fumo Rhineinc.In Does Amoxicillin Treat Uti

KennWaryKennWary2017/06/22 00:50Viagra Farmacia Costo <a href=http://viacheap.com>viagra</a> Acheter Cytotec En Ligne Levitra Espagne <a href=http://price-of-viagra.via100mg.com>Price Of Viagra</a> Progesterone In Germany Delivered On Saturday Generiques Sans Ordonnance <a href=http://zoloft.ccrpdc.com/where-to-buy-zoloft.php>Where To Buy Zoloft</a> Canadian Pharmacy Express

MatGroubyMatGrouby2018/04/17 22:58Nizagara Amoxicillin Powder Priligy Uk <a href=http://cialibuy.com>cheapest cialis 20mg</a> Acheter Le Kamagra Cialis Officiel

MatGroubyMatGrouby2018/06/09 06:17Propecia Hort Auf Zu Wirken Canadarx Mall Buy Avodart Brand <a href=http://cialibuy.com>canadian cialis</a> Buy 10 Mg Levitra Online Discounted Viagra

MatGroubyMatGrouby2018/08/20 11:09Sinus Infection Dosage Amoxicillin Cialis Et Periode Refractaire <a href=http://cialiorder.com>cheapest cialis 20mg</a> Does Keflex Cover Group A Streptococcus Viagra Prix Pfizer En Paris Buying 60 Mg Orlistat Outside The Us

トラックバック - http://osdevj.g.hatena.ne.jp/osdevj/20080331

2008-03-25

何をやってるのかおさらい 03:07 何をやってるのかおさらい - osdev-jの日記 を含むブックマーク

次はVGAに女の子の絵がでるのかな。

http://b.hatena.ne.jp/entry/http://osdevj.g.hatena.ne.jp/osdevj/20080321/1206094784

バレたッ

実際の見栄えはかなり悪い。いわゆるデジタル8色とそれを1フレームおきに点滅させて15色表現*1してるので。ポケコンとかRuputerでこういうのあったな。。

要するに、

  • Spartan 3 Starter Kit *2USBホストコントローラとCPUVGA CRTCを作り込めばその上で生活できるんじゃないか

という本を書いてるのでそれ。他所からの流用はしないというスタンスだったんですが、usb_phyと(デバッグ用の)UARTだけは他所から流用中。良くない。

CPUは適当に作ったらFPGAに収まらなかった。。乗算器とかレジスタがちゃんとハードマクロに推論されないので明示的に書く方向で。Xilinx専用になっちゃうけどまぁ仕方ない。

次はCPUを納めて、ワープロ専用機に仕立てる仕事。今までのは既に前例( ttp://www.keshi.org/blog/2005/12/binary_20_conference_2005.html )が有るわけだけど、ここから先は多分初めての体験だろう。

書き方と道具 03:07 書き方と道具 - osdev-jの日記 を含むブックマーク

テスト画像の↑はmdiappで書いたんだけど、普段使ってる

  • 『下のレイヤでマスク』
  • 設定を覚えてくれるブラシ
  • 設定を覚えてくれるパレット
  • エアブラシ(透明度が中心からの距離の関数で定義されるブラシ)

が無いのでなかなか辛い物が。。要するに、いままでは、

  • 領域指定のための下塗り (これで残りのレイヤをマスク)
    • 下地色
    • ハイライト

の4レイヤに分割して描いていたのをmdiappにそのまま持ち込むわけにはいかないので抜本的に新しい書き方を考えないといけなくなった。

普段はモノクロなので特に気になっていなかったが。。作者自身の作業プロセスや思想が色濃く反映されてるUIなのかなぁと思った。

自分の作業に最適化するとしたら、

  • A: タブレット入力とツールの状態を保持するベクトルレイヤ
  • B: 1~64bitxNの数値編集レイヤ
  • C: 着色された画像

に分割して、入力イベントをAに記録、Bに継続的にレンダリングして、色の選択はレイヤ単位という感じにするかなぁ。。

普通のペイントソフトのようにARGBの4要素全部をレイヤに持っている必然性は無くて、どうせベースとなる色は少ないんだからそこに特化して触った方が自然に思える。

とにかく、「RGB画像のビットマップを編集するツール」だと作業効率が悪いのは明白で、AppleのApertureとかMSExpressionみたいにギリギリまで素材で持っておいて、最後にビットマップにレンダリングするというアイデアが必要だと思う。

もっとも、GPUを活用しようとか考え始めると4要素固定にしないと色々と不味いことが起こるが。。

*1:8*2 = 16にならないのは、黒は点滅させても黒だから

*2http://strawberry-linux.com/catalog/items?code=21010

ryocotanryocotan2008/03/26 12:53> 色の選択はレイヤ単位
1/8bitレイヤーは、レイヤ単位で表示色を変えられるので(場所が分かりにくいも……レイヤーのダブルクリックで)、似たような事ができます:)

トラックバック - http://osdevj.g.hatena.ne.jp/osdevj/20080325

2008-03-21

通常の人間の期待より難しくない 01:00 通常の人間の期待より難しくない - osdev-jの日記 を含むブックマーク

前のエントリの写真ではわざわざ追加基板を付けてるが、回路図は↑。

スニファの方にも保護抵抗くらい付けろよと思うけど、まぁ実際問題動くので良し(良くない)。

しかし、12Mbpsのシリアル信号って結構高速な気がするけど、こんな適当な装置で動いて良いんだろうかと作ってる本人でも結構深刻に悩んでいたりする。実際、手元のUSB機器の多くはHUBさえ通せばこの装置で大抵通信(とパケットのキャプチャ)自体は出来る。まだダメなのがちらほら有るけどおそらくタイミングの問題。(そのために一応48MHz水晶も載せてる。これは一応秋月で買えるので良いかな。。と。)

まぁそもそもUSBはハードウェアを安く上げるためにそれなりに検討されてデザインされた規格なので適当に作って適当に動くくらいが目的を達しているという考え方も出来るが。。

で、これをやってて一番良くないのは、これPC向けにOS作るよりも簡単なんじゃないかと思える点。レガシーデバイスと付き合わなくて良いし、大抵の仕様は外に出てるし、機種間の違いも無いし。。もちろん、実際はそんな事は無くて、コンパイラも無いしクロックも100MHz以上出すのは非常に難しいので計算力での誤魔化しも効かないしフルカラーも出ない。それでも、大抵のタスクは50MHzで十分で、大抵のプログラミングはアセンブラで十分だとしたら。。

制作ちょっと順調 19:19 制作ちょっと順調 - osdev-jの日記 を含むブックマーク

USBホストコントローラがUSB HUBからACKを受信しているの図

全体をシンプルに設計し直して*1、自分の原稿を読みつつゼロからやってみるテスト。*2

VGAは多分1時間も掛からないので、問題はCPU。。通常の人間は倍くらい掛かると思いますが、それでも某30日よりは短い期間で一通り終わるはずです。

あと、Monaを使ってエミュレータ制作 は没りました。時間の都合上。。libusbだとUSB HUBが制御できないけどまぁ仕方ない。。

当初はPropeller( http://en.wikipedia.org/wiki/Parallax_Propeller )のような設計思想で、シリアルI/O群(VGA,UART,USB)を全部ソフトウェアエミュレーションで実装する方向性で作ってたけど、これだとちょっと教育的じゃないと思って。デバッグも大変だし。

USBホストコントローラで困ったこと

  • USBバスリセットを忘れた
  • 抜き差しのしすぎで機器側コネクタが死んでたのに気づかなかった

写真の上のコネクタ2つはUSBスニファ機能用。要するに、

  1. USBスニファで本物のPCの信号を観察して、受信部が正常に機能することを確かめる
  2. 自分の信号をバスモニタを通してみて、自分の信号が正常であることを確かめる

の2段構えで実装作業を行った。

*1:自動生成コードをデバッグするのは無理という声がレビュアーから寄せられたため

*2:本来的にはコレは2ヶ月くらい前に終わってないと不味い作業なんですが。。

トラックバック - http://osdevj.g.hatena.ne.jp/osdevj/20080321