to site top page

Debian Blacklist

いきてます.更新するの何日ぶりでしょう.まぁ,どうでもいいですね.ネタ自体はかなり古いんですが,先日確認する機会があったので.

2008/5/13に報告が確認されました.原因はCVE-2008-0166へのPatch適用.背景としてはそんなところ.

導入と確認

Debian系は当然パッケージあります.

$ cat `ls /etc -F | grep "release$\|version$" | sed -e "s/^/\/etc\//g"`
wheezy/sid
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=12.04
DISTRIB_CODENAME=precise
DISTRIB_DESCRIPTION="Ubuntu 12.04.1 LTS"
NAME="Ubuntu"
VERSION="12.04.1 LTS, Precise Pangolin"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu precise (12.04.1 LTS)"
VERSION_ID="12.04"
$ aptitude search blacklist
p   openssh-blacklist           - ブラックリスト入りしているデフォルトの OpenSSH RSA および DSA 鍵の一覧                                                                
p   openssh-blacklist-extra     - ブラックリスト入りしている非デフォルトの OpenSSH RSA および DSA 鍵の一覧                                                              
p   openssl-blacklist           - Blacklists for  OpenSSL RSA keys and tools                                                                                            
p   openssl-blacklist-extra     - Non-default blacklists of OpenSSL RSA keys                                                                                            
p   openvpn-blacklist           - list of blacklisted OpenVPN RSA shared keys
$ aptitude show openssl-blacklist
パッケージ: openssl-blacklist            
状態: インストールされていません
バージョン: 0.5-3
優先度: 任意
セクション: net
メンテナ: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
アーキテクチャ: all
展開サイズ: 12.5 M
依存: python, openssl (>= 0.9.8g-9)
事前依存: dpkg (>= 1.10.24)
説明: Blacklists for  OpenSSL RSA keys and tools
 This package contains the openssl-vulnkey tool and the common lists of known-bad OpenSSL keys to use when examining suspect keys with openssl-vulnkey. 
 
 RSA-1024, RSA-2048

openssl-blacklistでRSA-1024とRSA-2048の脆弱鍵リストがインストールされます.RSA-512とRSA-4096も欲しい方はopenssl-blacklist-extraも導入しましょう.

$ sudo aptitude install openssl-blacklist openssl-blacklist-extra

導入すると/usr/share/openssl-blacklist以下にblacklist.RSA-鍵長という脆弱鍵リストのファイルが生成されます.RSA秘密鍵をこれと照らし合わせることによって脆弱鍵のチェックを行います.

どうやって比較してるのか確認してみましょう.openssl-blacklistをインストールするとopenssl-vulnkeyってコマンドがインストールされるんで,とりあえずこいつ見てみます.行頭の数字はファイル内での行番号です.

$ file `which openssl-vulnkey`
/usr/bin/openssl-vulnkey: a /usr/bin/python script, ASCII text executable
$ vim -R /usr/bin/openssl-vulnkey

※僕は「vimの操作性で,vimのsyntax highlightをつかって」中身を見たいのでvim -R使いましたけどべつにmoreでもlessでもlvでも,見るだけならgeditでもnanoでも何でもいいかと.編集はしない方がいいと思います.

中を覗くとcheck_dbって関数がいて,これで判定している模様.check_dbの中身が以下.

120 def check_db(bits, last, modulus, name=""):
121     '''Check modulus against database'''
122     global db_lines
123     if last != bits:
124         db = db_prefix + bits
125         # Read in the database
126         try:
127             fh = open(db, 'r')
128         except:
129             try:
130                 print >> sys.stderr, "WARN: could not open database for %s " \
131                                      "bits. Skipped %s" % (bits, name)
132             except IOError:
133                 pass
134             return False
135         
136         db_lines = fh.read().split('\n')
137         fh.close()
138         
139     key = hashlib.sha1(modulus).hexdigest()
140     #print "bits: %s\nmodulus: %s\nkey: %s\nkey80: %s" % (bits, modulus, key, key[20:])
141     if key[20:] in db_lines:
142         if not options.quiet:
143             print "COMPROMISED: %s %s" % (key, name)
144         return True
145     else:
146         if not options.quiet:
147             print "Not blacklisted: %s %s" % (key, name)
148         return False

追っていきますと,

  1. 脆弱鍵リスト読み込みます
  2. modulusのsha1を計算し,16進ダイジェストを作成します
  3. 16進ダイジェストの末尾20桁が脆弱鍵リストにあるかどうか確認します

引き続き追っていきます.該当行のみ並べていくので行番号が行ったり来たりしてます.

199         modulus = get_modulus(contents)

178         (type, contents) = get_contents(f)

160     for f in args:

 44 (options, args) = parser.parse_args()

 34 parser = OptionParser(usage="%prog FILE [FILE]", \

OptionParser調べると,argsにはファイル名が入るようですね.get_contents(ファイル名)で返ってきた値の片方をget_modulusに投げ込むとmodulusが得られる.さらに追います.

62 def get_contents(file):
 63     '''Determine the type of certificate it is. Returns empty string if
 64        unsupported.'''
 65     args = ['-modulus', '-text', '-in', file]
 66      
 67     rc, report = cmd(['openssl', 'rsa'] + args)
 68     if rc == 0:
 69         return ("rsa", report)
 70         
 71     rc, report = cmd(['openssl', 'x509'] + args)
 72     if rc == 0:
 73         return ("x509", report)
 74         
 75     rc, report = cmd(['openssl', 'req'] + args)
 76     if rc == 0:
 77         return ("req", report)
 78         
 79     return ("", report)

上記から,(type, contents) = get_contents(f)でcontentsに代入されるのが,

$ openssl rsa|x509|req -modulus -text -in file_name

で返される文字列で,改行で区切ったその中から

105 def get_modulus(contents):
106     '''Find modulus of file'''
107     for line in contents.split('\n'):
108         if re.match(r'^Modulus=', line):
109             return line + '\n'
110
111     return ""

「Modulus=文字列\n」っていう値がmodulusに代入されます. modulusが出たので,あとはmodulusからsha1の16進ダイジェストを計算して末尾20桁取り,それがblacklistにあるかどうか調べればよい,と.

check_db見るとファイルとして脆弱鍵リスト読み込んでます.db_prefix = "/usr/share/openssl-blacklist/blacklist.RSA-"で,

$ ls -alF /usr/share/openssl-blacklist/blacklist.RSA-*
-rw-r--r-- 1 root root 6193514  6月 24  2011 /usr/share/openssl-blacklist/blacklist.RSA-1024
-rw-r--r-- 1 root root 6193514  6月 24  2011 /usr/share/openssl-blacklist/blacklist.RSA-2048
$ $ head -n 10 /usr/share/openssl-blacklist/blacklist.RSA-2048
# After these initial comments, each line must consist of the lower-case key
# modulus checksum:
#   openssl rsa -noout -modulus -in /tmp/key.pem | sha1sum | cut -d ' ' -f 1)
# with the first 20 characters removed (that is, the lower 80 bits of the
# fingerprint). Unless these rules are followed, the blacklist will not work
# properly. See openssl-vulnkey(1).
00006aa0ce2cd60e6660
00008be7025d9f1a9088
00008f7e6a29aea0b430
0001313db46d8945bba0

こんな感じで,11行目以降も20桁の文字列が記載されてます.

以上から,アプリケーションとかでdebian脆弱鍵に該当するかどうか調べるときは,RSA鍵のmodulusの頭に「Modulus=」をつけて末尾に改行をつけてsha1のhexdigest計算してリストと照らし合わせればよい,というわけです.

どうです?かんたんでしょ?

...まぁ,これ実装しなきゃならん状況っつうのがなかなか思い浮かびませんが.

can't load my result

前後の記事

最近の記事(5件分)

する事

そのうち記事にするかもリスト

欲しい本