2014年10月17日金曜日

セキュリティ的にイケてないソフトを何となく探すテスト



ふとした思いつきで、簡単にセキュリティ的にイケてないソフト探す事ができるかもしれないなと思ったのでイケてないソフトを探すソフトを作ってみた。


やってる事




  1. C言語の文字列操作関数を使っているか調べる(セキュリティホールになりやすい)

  2. スタック保護がなかった時代のVisualC++を使っているか調べる

  3. DLL/EXEの作成日時を調べる


C言語の文字列関数を使っているDLL/exe(といっても文字列探索してるだけ)を見つけたら表示します。作成年が2003年とか古かったらメンテナンスされていない可能性のある要注意ソフトです。


さらに後ろにtrue/falseと表示してますが、trueの倍スタック保護がなかった(or 弱かった)時代のVisualC++を使っているソフトです。


実行例


以下はFirefoxでの実行例です



C:\Program Files (x86)\Mozilla Firefox/d3dcompiler_46.dll 2013 true


C:\Program Files (x86)\Mozilla Firefox/uninstall/helper.exe 2010 true















使い方:


ruby installerでrubyをインストールした後に


以下のソースを拡張子.rbで保存して、実行すればいいです。(c:\以下を探索)


(実行時にパスを引数として渡すと、そのパス以下を処理します)


(installerはバージョン2.0系を使っとけばとりあえず無難かなと。)



#!/usr/bin/ruby
# coding: ASCII-8BIT
def dumpTime(file)
dangerFunc = false
oldVC=false
begin
content = File.binread(file);#.binread()
rescue
return
end
year=2014
pos=content[0..2000].index("PE\0\0")
if(pos!=nil)then
date=content.getbyte(pos+8)+
content.getbyte(pos+9)*2**8+
content.getbyte(pos+10)*2**16+
content.getbyte(pos+11)*2**24
year = Time.at(date,0).strftime("%Y").to_i
end
psFlag=false
sprintFlag=false
content.split(/[\s\0]+/).each do |line|
oldVC = true if (/(MFC\.DLL)|(MFC42\.DLL)|(MFC70\.DLL)|(MFC80\.DLL)|(MSVCRT\.DLL)/i =~ line)
psFlag = true if(/\%s/ =~ line && !(/CLSID(\\)*\%s/=~line) )
sprintFlag = true if(/sprintf/ =~ line)
dangerFunc = true if(sprintFlag && psFlag)
dangerFunc = true if(/strcat/ =~ line) #strcpy getは当面除外
end

puts "#{file}\t#{year}\t#{oldVC}" if(dangerFunc && (oldVC || year <2009 || 2030<year) )
end

def run(dir)
#$stderr.puts "DIR: #{dir}"
begin
dd=Dir.open(dir)
rescue
return
end
dd.each do |f|
next if( f=="." || f == ".." || /^\$/=~f )
file=dir +( "/" + f)
run(file) if FileTest.directory?(file)
dumpTime(file) if(( f=~ /\.exe$/i || f=~ /\.dll$/i|| f=~ /\.ocx$/i ) && FileTest.file?(file))
end
end

start=ARGV[0]
start="c:/" if(start==nil)

run start
$stderr.puts "End===press any key to exit===="
$stdin.gets






0 件のコメント:

コメントを投稿