encryption disk

Table of Contents

NAT

仮想マシンを起動するエイリアスを登録した。

alias i3='doas vmctl start -cL -m 1G -i1 -d /mnt/VM/i3 -d /mnt/VM/pkg i386'

これでワンタッチで起動してくる。仮想マシンの端末は、-c がついているんで、 ttyなコンソールになる。このコンソールをtmuxで増量すればいいんだな。実際に やってみると、一見正常のような挙動を示すけど、emacsを動作させると、途端に 怪しい状況に陥いる。そう、最悪なタイミングで、最悪にもハングするんだ。 こんな不幸は無いぞ。

だったら、この仮想マシンをサーバーの扱いにして、河豚板側からsshすればいいじゃん。 クリチカルな事は、仮想マシンのコンソールから行なうって事でいいだろう。

> 仮想マシンの中のsshdに接続するには、どうやれば良いですか。何となく、pf.conf
> に追加が必要とは思うんでが。qemuだとコマンドラインで

> qemu-system-i386 -m 96 -nographic -no-fd-bootchk -s \
>  -net nic -net user,hostfwd=tcp::2022-:22  \
>  -hda disk
  
> ssh -p 2022 localhost

ホストからだったら、単純に
  ssh 100.64.1.3
ですかね(アドレスは違ってるかも。実地に確認願います)。

との事なので、河豚板からsshすると、

eq$ ssh 100.64.1.3
ssh: connect to host xxx.xxx.xxx.xxx port 22: Operation timed out 

何で? 接続先は伏せ字にしたけど、愛用してるサーバー機だ。

eq$ ping -c 3 100.64.1.3
PING 100.64.1.3 (100.64.1.3): 56 data bytes
64 bytes from 100.64.1.3: icmp_seq=0 ttl=255 time=2.087 ms
64 bytes from 100.64.1.3: icmp_seq=1 ttl=255 time=0.858 ms
64 bytes from 100.64.1.3: icmp_seq=2 ttl=255 time=0.654 ms 

基本に返って、導通試験。問題ないなあ。

eq$ ssh -v 100.64.1.3
OpenSSH_9.9, LibreSSL 4.0.0
debug1: Reading configuration data /home/sakae/.ssh/config
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: Connecting to xxx.xxx.xxx.xxx [xxx.xxx.xxx.xxx] port 22.
^C 

sshにdebug-modeが有った事を思い出した。識者に相談。

> pfctl -d として、PFを無効化してみたら、sshはどうなりますか?

やってみたけど、やはり上記と同様のエラーになった。

ならばsshに代わるサーバーを仮想側で動作させておいて、そこに送信してみるか。 そんな都合の良いアプリは有る? 脳内の引き出しを引っかき回してみる。2つ出てきた。 gdbを入れたんで、それに小判鮫のごとくついて来たpython。こやつなら、簡易の Webサーバーになるな。河豚板側には、w3mも存在してる事だし。

もう一つは、ncって言う、万能なネットワークツール。今回はこれを使ってみる。 仮想側で、サーバーを立てる。

i3$ nc -l 9696

太陽活動の活発化に伴ってオーロラが見えたりする年だったので、太陽黒点に あやかって、ポート番号はクログロにしてみた。-l は、待受してからねって意味だ。

なお、太陽活動は11年周期で活発になる。これで喜ぶのは、アマチュア無線家だ。 電離層での電波の反射がハンパナイ状態になって、思わぬエリアと通信できるから だ。普通は嫌われ者。人工衛星が故障する、通信障害が発生する、送電線に 異常電流が発生しその影響で、大規模停電が発生する事が有るからだ。 なんたって、送電線は長大なアンテナと見做せるからね。 なお、11年周期ってのは、変動する数値。過去には、14年とか9年の周期ってのが あったそうだ。屋久島の長寿杉の年輪分析で判明してる。

ncを思い出したのは、脳のリフレッシュの為です。オイラーの脳はDRAMですから、常に リフレッシュしていないと、記憶が蒸発してしまいます。待てDRAMじゃなくてROMだろう。 石頭で、新たな情報を記憶できない。昔に焼いた昭和の記憶しか入っていない奴。 いや、神のご威光が照射されると、すっかり昔の事を忘却して、言われるままを記憶 しちゃう事だってあるぞ。そう紫外線で消去できる、EEPROMかも知れないな。 神の意向で、投資とかに手を出さないようにね。年寄はすぐに信じるからなあ。

ああ、無駄話だったわい。河豚板側から、電文を送信してみる。

eq$ echo QTH is Fuguita | nc -w 2 100.64.1.3 9696

こちらの住所(QTH)は河豚板ですってね。ちゃんと先方へ届いたよ。なお、-w 2は、

-w timeout
        Connections which cannot be established or are idle timeout after
        timeout seconds.  The -w flag has no effect on the -l option,
        i.e. nc will listen forever for a connection, with or without the
        -w flag.  The default is no timeout.

こんな意味合いがある。

こうなると、sshに個別の問題が有るとしか思えない。さきほどのdebug情報を見ると .ssh/configを参照してる。

eq$ cat .ssh/config
Hostname   xxx.xxx.xxx.xxx
Host    ob
User    sakae
Port   

ああ、これを参照しちゃって、コマンドライン入力が無視されたんか。3ヶ月の短期 記憶を辿れば、emacs+trumpで、リモートにあるファイルを編集する実験に使った ものだった。情けないなあ、メッセージは、ちゃんと読もうよ。

もう一つの灯台下暗し例。NAT出来ないと騒いでた。が、man vmctlを熟読すると

LOCAL INTERFACES
     Local interfaces can be used to easily configure VM networking without
     needing to manually assign network addresses.  A local interface is added
     to a VM using the -L option to the 'vmctl start' command and results in

     If NAT is desired, the net.inet.ip.forwarding sysctl(8) must also be set
     to 1.

ちゃんと説明されてるじゃん。もう、コピペ野郎ってのがバレバレだな。 心を新たにして、NATの威力を確認。

i3# syspatch
i3# syspatch
syspatch: cdn.openbsd.org: no address associated with name

上段は、pfctl -eの状態の時、下段はpfctl -dして、無効にした時。アドレス解決が できなくて、失敗してる。

本家の暗号化disk

前回は、暗号化をやった。おさらいでインストール中の暗号部分の設定を取り出してみた。

  :
Available disks are: sd0.
Which disk is the root disk? ('?' for details) [sd0]
Encrypt the root disk with a (p)assphrase or (k)eydisk? [no] p

Configuring the crypto chunk sd0...

No valid MBR or GPT.
Use (W)hole disk MBR, whole disk (G)PT or (E)dit? [whole]
Setting OpenBSD MBR partition to whole sd0...done.
New passphrase:123456
Re-type passphrase:123456
sd1 at scsibus2 targ 1 lun 0: <OPENBSD, SR CRYPTO, 006>
sd1: 1023MB, 512 bytes/sector, 2096560 sectors

Configuring the root disk sd1...

No valid MBR or GPT.
Use (W)hole disk MBR, whole disk (G)PT or (E)dit? [whole]
Setting OpenBSD MBR partition to whole sd1...done.
The auto-allocated layout for sd1 is:
#                size           offset  fstype [fsize bsize   cpg]
  a:          1006.5M               64  4.2BSD   2048 16384     1 # /
  b:            17.2M          2061408    swap
  c:          1023.7M                0  unused
Use (A)uto layout, (E)dit auto layout, or create (C)ustom layout? [a]
/dev/rsd1a: 1006.5MB in 2061344 sectors of 512 bytes
5 cylinder groups of 202.50MB, 12960 blocks, 25920 inodes each
/dev/sd1a (b2529a82099d82c1.a) on /mnt type ffs (rw, asynchronous, local)
  :

これと絡めてインストール・スクリプトを参照してみる。場所は、 src/distrib/miniroot/install.sub

encrypt_root() {
        local _args _chunk=$ROOTDISK

         while :; do
                ask 'Encrypt the root disk with a (p)assphrase or (k)eydisk?' no
                case $resp in
                # Retry on failure to allow passphrase or skip.
                [kK]*)
                        pick_keydisk || continue
                        _args=-k$KEYDISK
                        break
                        ;;
                [pP]*)  $AI || break
                        ask_passphrase 'New passphrase?'
                        _args=-s
                        break
                        ;;

        echo "\nConfiguring the crypto chunk $_chunk...\n"
        md_prep_fdisk $_chunk
        echo 'RAID *' | disklabel -w -A -T- $_chunk

        # Standard input is ignored in interactive mode.
        print -r -- "$_passphrase" |
                bioctl -Cforce -cC -l${_chunk}a $_args softraid0 >/dev/null
        unset _passphrase

        # No volumes existed before asking, but we just created one.
        ROOTDISK=$(get_softraid_volumes)
        ROOTDEV=${ROOTDISK}a
        SWAPDEV=${ROOTDISK}b
        echo "\nConfiguring the root disk $ROOTDISK...\n"
}

この手続は、 do_install の比較的前段階から呼び出されている。

河豚板での暗号化disk

河豚板でも暗号化を提供しているので、コードを見ておく。

FuguIta/rdroot/boottmp/usrfadm と言うshell scriptの中。

if echo "$disklabel" | grep -q 'd:.*RAID'; then
    notice 'Setting up for data store encryption'

    # setup passphrase file
    #
    rm -f $enc_ppfile
    local def_umask=`umask`
    umask 077
    echo "$enc_pp1" > $enc_ppfile
    chmod 0600 $enc_ppfile
    umask $def_umask
    unset enc_pp1

    # create a crypto volume
    #
    bioctl -p $enc_ppfile -c C -l /dev/${scandev}d softraid0
    rm -f $enc_ppfile

    # check and get created device
    #
    datdev=$(bioctl -i softraid0 \
            | awk "/^softraid.*CRYPTO\$/ { dev=\$(NF-1) }
                   /<${scandev}d>\$/     { datdev=dev }
                   END                   { print datdev }")

暗号化に必要なフレーズを事前に準備。そしてその扱いには厳しい制限が課されている。

-p passfile
        Passphrase file used when crypto volumes are brought up.  This
        file must be root owned and have 0600 permissions.

2to3

前回、暗号化されたdiskから、johnで必要な情報を取り出す pythonスクリプトを試した。あの時は、最終的にpython2を入れてお茶を濁して しまった。ちょっと悔しいので、python3でも動作する様に改造してみたい。

そんなの、2to3 ってスクリプトに任せてしまえ。

eq$ 2to3 openbsd_softraid2john.py
/usr/local/bin/2to3:3: DeprecationWarning: lib2to3 package is deprecated and
 may not be able to parse Python 3.10+  from lib2to3.main import main
RefactoringTool: Skipping optional fixer: buffer
RefactoringTool: Skipping optional fixer: idioms
RefactoringTool: Skipping optional fixer: set_literal
RefactoringTool: Skipping optional fixer: ws_comma
RefactoringTool: No changes to openbsd_softraid2john.py
RefactoringTool: Files that need to be modified:
RefactoringTool: openbsd_softraid2john.py
eq$ python3 -V
Python 3.11.10

さすがにこの変換器のお役目は終了したみたいだ。いや、python3が地道に進化してて、 それに 2to3 を追従させるのが面倒になったんだろう。2から3への劇的な変化に 見回れた時は重宝したんだけどね。こうなったら人力で変換だな。

なお、python3.15だかで、文字のエンコードがutf-8に完全に移行するらしい。また 阿鼻叫喚な声が上がるかな。どうせなら2to3の時に、やっておけば良かったものの。 図体が大きくなりすぎて、そこまで手が回らなかったのか。

誰もがpythonを使う最大の理由は、AIブームだな。numpyが隠れた主役だろう。これを 使いたいばっかりで、親のpythonが選択されるってのが巷のpythonバブルに拍車を かけているはず。誰もpythonが好きで使ってる訳では無いと思うよ(個人の感想)。

Run pdb (like this): python3 -m pdb openbsd_softraid2john.py /mnt/VM/a6

(Pdb) b process_file
  :
(Pdb) p start
40960
(Pdb) p headers[260]
2
(Pdb) headers[284]
0

上記の様にif式を使って、意に沿わない場合は終了する様に仕組まれている(ソースを 参照の事)。if式をコメントに追い遣って先に進めると、核心部分が出てくる。

a6:$openbsd-softraid$2093489994$Traceback (most recent call last):
  File "/ram/home/sakae/./openbsd_softraid2john.py", line 89, in <module>
    process_file(sys.argv[i])
  File "/ram/home/sakae/./openbsd_softraid2john.py", line 72, in process_file
    sys.stdout.write(hexlify(headers[2424:2552]) + "$")  # salt
                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~
TypeError: can't concat str to bytes
--- /mnt/my/src/john-1.9.0-jumbo-1/run/openbsd_softraid2john.py Sun Nov 24 16:33
:00 2024
+++ openbsd_softraid2john.py    Sun Dec  8 07:19:33 2024
@@ -1,4 +1,4 @@
-#!/usr/local/bin/python2.7
+#!/usr/local/bin/python3
 # -*- coding: utf-8 -*-
 #
 #  Copyright (c) 2014 Thiébaud Weksteen <thiebaud at weksteen dot fr>
@@ -39,21 +39,21 @@

 def process_file(filename):

-    headers = open(filename).read()[:0xaa0 + 81920]
-    start = headers.find("marcCRAM")
+    headers = open(filename, 'rb').read()[:0xaa0 + 81920]
+    start = headers.find(b"marcCRAM")
     if start != -1:
         headers = headers[start:]

-    if headers[:8] != "marcCRAM":
+    if headers[:8] != b"marcCRAM":
         sys.stderr.write(filename + " : Wrong magic\n")
         return
-    if headers[72:81] != "SR CRYPTO":
+    if headers[72:81] != b"SR CRYPTO":
         sys.stderr.write(filename + " : Wrong RAID type\n")
         return
-    if headers[260] != "\x01":
+    if headers[260] != 1:
         sys.stderr.write(filename + " : Wrong optional header type\n")
         return
-    if headers[284] != "\x02":
+    if headers[284] != 2:
         sys.stderr.write(filename + " : Wrong encryption type\n")
         return

@@ -69,13 +69,13 @@
     # num_iterations and salt come from the "scm_kdfhint" field
     num_iterations = struct.unpack("<I", headers[2420:2424])[0]
     sys.stdout.write(str(num_iterations) + "$")
-    sys.stdout.write(hexlify(headers[2424:2552]) + "$")  # salt
+    sys.stdout.write(hexlify(headers[2424:2552]).decode() + "$")  # salt

     # masked keys, sr_meta_crypto structure
-    sys.stdout.write(hexlify(headers[364:2412]) + "$")
+    sys.stdout.write(hexlify(headers[364:2412]).decode() + "$")

     # HMAC, chk_hmac_sha1 field
-    sys.stdout.write(hexlify(headers[2676:2696]))
+    sys.stdout.write(hexlify(headers[2676:2696]).decode())

     sys.stdout.write("$%s\n" % sr_crypto_genkdf_type)

see Python 3 での文字列とバイト列の相互変換と16進数表示

cutter

上のコードに、こんなのが出てくる。

headers = open(filename, 'rb').read()[:0xaa0 + 81920]
start = headers.find(b"marcCRAM")

diskの冒頭から 0xaa0 + 81920 までを読み込んでくれって言うスライスだよな。 これだけのサイズ中に、暗号を紐解く情報が入ってるって事だ。ならば、最初から このサイズ分だけのファイルを用意しておけば、無駄を省けるはず。

こういう場合は普通、ddコマンドを使う。

eq$ gdb -q
(gdb) p (0xaa0 + 81920)
$1 = 84640

終端をgdbで計算(16進数、10進数の混合演算もなんのその)。そして、それを適用する。

eq$ dd if=/mnt/VM/a6 of=minia6 bs=1 count=84640
84640+0 records in
84640+0 records out
84640 bytes transferred in 0.273 secs (310017 bytes/sec)

もっとシンプルに指定できる。

eq$ < /mnt/VM/a6 dd count=84640 bs=1 > out

その他、オクタルダンプして、それをxxdで元に戻すって方法が有る。

eq$ od -An -N 84640 -t x1 /mnt/VM/a6 | xxd -r -p > output

pythonだって、一行野郎を駆使できます。

python3 -c 'import sys; sys.stdout.buffer.write(open("/mnt/VM/a6", "rb").read(84640))' > out

そんじゃ、任意の位置から任意のサイズを切り出せって場合は? ddではskipって指定 も併用できるんで、難なくこなせる。もう、ddの一人勝ちですよ。

応用

なんで切り出しか? dd便利だよーーの実例を示す為? いいえ、もっと切実な問題 解決への一歩なのさ。そう、diskをhexdumpしたかったから。1Gのそれを扱うんじゃ、 取り回しが悪い。必要な部分だけ相手なら、気楽なものだ。検索自在なhexeditなんて のが公開されてる(これに手を染めるようだと、バイナリアン認定です)。

が、このアプリは河豚板には不在。仮想マシンに入れてある。仮想マシンに1Gのファイル(disk) を、転送するって無駄の極みだ。必要部分だけって、ならざるを得ない。

で、転送したのをhexeditで開いてみたぞ。

0000A000   6D 61 72 63  43 52 41 4D  06 00 00 00  0C 00 00 00  marcCRAM........
0000A010   DE F9 DD EA  F4 85 42 87  A1 EA 34 0A  5D BB AF 78  ......B...4.]..x
0000A020   01 00 00 00  00 00 00 00  02 00 00 00  00 02 00 00  ................
0000A030   00 00 00 00  43 00 00 00  B0 FD 1F 00  00 00 00 00  ....C...........
0000A040   4F 50 45 4E  42 53 44 00  53 52 20 43  52 59 50 54  OPENBSD.SR CRYPT
0000A050   4F 00 00 00  00 00 00 00  30 30 36 00  00 00 00 00  O.......006.....
0000A060   3E A2 75 63  96 59 2A 1D  D8 C0 1A 46  43 4A 43 3E  >.uc.Y*....FCJC>
0000A070   73 64 31 00  00 00 00 00  00 00 00 00  00 00 00 00  sd1.............
0000A080   00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00  ................
0000A090   00 00 00 00  10 02 00 00  07 00 00 00  00 00 00 00  ................
0000A0A0   00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00  ................
0000A0B0   73 64 30 61  00 00 00 00  00 00 00 00  00 00 00 00  sd0a............

emacs with xsel

前回xselを利用してコピペする方法を探った。が、ペースト動作がCUI版のemacs では無視されてしまってたので、下記を創造した。

(defun paste-from-xsel ()
  "Paste clipboard content into the current buffer using xsel."
  (interactive)
  (let ((clipboard-content
          (shell-command-to-string "xsel --clipboard --output")))
    (if (not (string-empty-p clipboard-content))
        (insert clipboard-content)
      (message "Clipboard is empty or xsel is not working."))))

(global-set-key (kbd "C-c y") 'paste-from-xsel)

etc

EBUG勉強会/20241130河豚板のIBT対応

河豚板の作者さんが公開された一級の資料。昔読んだ事がある カッコウはコンピュータに卵を産む を彷彿されますよ。

カッコウの作者さんは、ほとんど孤独な戦いだったけど、河豚板の作者さんは 良き仲間に恵まれて、楽しい苦労だったに違いない(外野がとやかく言う事じゃ ないけど)。

README

月に向かえ!―最新心理学が明かす「アポロ計画」を成し遂げた人たちのマインドセット

なんて本を読んだ。題名通りなんだけど。帯に格好いい文言がでてた。

NASAで教わった 『早く行きたいなら一人で行けばいい。でも遠くへ行きたいなら 仲間と行け。』を思いだした。

困難な事を成し遂げるには8つのマインドセットが重要との事。

  1. 情熱を燃やす。2. イノベーションを生みだす。….

2.の例として、こんな練習問題が出てた。

犬、蛇、イルカ、熊、金魚、虎。 これらの動物を貴方なりの解釈で、2つのグループに 分けてください。それぞれのグループは3つの動物になるようにします。

例として、4足動物のグループと、それ以外の動物グループ。オイラーは2分別しか できなかった。老化かしら?


This year's Index

Home