Warrant canary

http://en.m.wikipedia.org/wiki/Warrant_canary

ISP 或是 VPN 供應商或是任何網路公司在政府沒有強制公司交出使用者資料時(沒有任何搜索票的時候),在網站上掛一個告示說“政府沒有向我們要資料”。

收到搜索票強制公司交出使用者資料,並且命令不得公開搜索票資訊(如此使用者就不知道公司被搜索)的時候,就把告示撤下。一見到告示被撤下,使用者就知道公司被迫交出使用者資料了。

理論是說,政府雖然可以命令不得公開搜索票(封口令),但是卻沒辦法強制公司說謊。

好聰明的辦法,雖然說實務上還沒有這樣的案例。

編譯 HTC Android kernel 和自製 kernel module

Kernel

這部分參考 HTC kernel source code 隨附的 Readme

首先把 compiler 抓下來

git clone https://android.googlesource.com/platform/prebuilts/gcc/linux-x86/arm/arm-eabi-4.6

指定環境變數

export TOP= [where you installed the toolchain or top of android AOSP code base]
export PATH=$TOP/prebuilts/gcc/linux-x86/arm/arm-eabi-4.6/bin:$PATH (use corresponding arm-eabi bin path)
export ARCH=arm
export SUBARCH=arm
export CROSS_COMPILE=arm-eabi-

套用 defconfig 設定檔

make k2_u_defconfig

真正編譯,可以調整平行編譯數

make -j8

Kernel Module

kernel module 需要已經編譯好的 kernel 才能編譯。Makefile 參考這邊

obj-m 指定編譯出的 object 檔名,應該要與 .c 原始檔同名(如果要編 feng.c ,object 檔就要寫 feng.o)
KERNELDIR 是已經編譯好的 kernel 的目錄

CROSS_COMPILE 指定 toolchain 的目錄

然後 make 就可以了。

HTC Android kernel write protection

HTC 的 ROM kernel 裏面都會有特製的函數使得某些分割區在 kernel (也就是 driver )層的寫入被阻擋。

就算檔案系統掛載模式是 rw 也沒用,因爲 kernel 裏面寫入 mmc 卡的 driver 根本就不支援寫入。

這種寫入保護應該就是大家常稱的 s-on / s-off ,不過我不確定。還有這樣的保護應該是在所有機型的 kernel 當中都有,不過我也只檢查過 One SV 的 kernel。

這樣的寫入保護使得取得 root 的實際用途大大地受限,因爲就算取得 root 之後還是很多地方沒辦法改。而且不像取得 root ,HTC 官方並不提供任何解開寫入保護的方法。

防寫功能由 CONFIG_MMC_MUST_PREVENT_WP_VIOLATION 這個編譯選項啓動。

防寫相關的函式在 drivers/mmc/card/block.c 。

get_tamper_sf() 會去讀 bootloader 給的參數 td.sf ,應該是辨別裝置是否被修改過的變數,至於 bootloader 是如何判別這件事情的就不清楚了。

wp_prevention_partno 變數存的是要保護的 partition ,但只有一個 partition 就有點奇怪了。這個變數由 arch/arm/mach-msm/emmc_partitions.c 的 parse_tag_msm_partition() 設定。

真正阻擋寫入的地方是在 block/blk-core.c 的 generic_make_request_checks() 當中

繞過的方法應該有2種:一是把 mmc0_write_prot_type 設成 0 ,二是把 wp_prevention_partno 設成某個不存在的 partition 。這兩種方法目前都無法驗證是否有效,因用爲這兩種方法把防寫解開之後真的寫入都會有這樣的訊息:


<6>[ 1303.057286] c0 mmc0: Applied soft reset to Controller
<6>[ 1303.057317] c0 mmc0: cid 1501004d38473246420a660a5f1acf64 (M8G2FB)
<6>[ 1303.057347] c0 mmc0: csd d02701320f5903fff6dbffef8a404066
<6>[ 1303.057378] c0 mmc0: fw_ver
<3>[ 1303.058446] c0 mmcblk0: timed out sending SET_BLOCK_COUNT command, card status 0x900
<3>[ 1303.058476] c0 mmcblk0: not retrying timeout
<3>[ 1303.058537] c0 end_request: I/O error, dev mmcblk0, sector 791569
<3>[ 1303.058598] c0 end_request: I/O error, dev mmcblk0, sector 791577
<3>[ 1303.058629] c0 end_request: I/O error, dev mmcblk0, sector 791585
<3>[ 1303.058660] c0 end_request: I/O error, dev mmcblk0, sector 791593
<3>[ 1303.058690] c0 end_request: I/O error, dev mmcblk0, sector 791601
<3>[ 1303.058751] c0 end_request: I/O error, dev mmcblk0, sector 791609
<3>[ 1303.058782] c0 end_request: I/O error, dev mmcblk0, sector 791617
<3>[ 1303.058934] c0 Aborting journal on device mmcblk0p33-8.

似乎是 driver 的問題,目前還沒找到解法,需要更熟悉 Linux kernel 的相關知識……

回到上面兩種解法,想法都是基於 flar2 的 wp_mod.ko ,取得了 root 權限以後再插入特製的 kernel module 來變更 mmc0_write_prot_type 或 wp_prevention_partno 的值。

兩種方法的原始碼在 gist (feng.c 是我隨便命名的,就是風啦),順便附上 Makefile ,至於如何 compile 給 Android 的 kernel module ,我打算寫在另外一篇。

鳳梨酥計劃:FreeBSD on OpenStack

最近都在交大計中內玩 OpenStack 相關的事情。

FreeBSD 是我架伺服器的首選,令人意外的是要在 OpenStack 上面跑 FreeBSD 到現在依然都還沒有很好的方案…

CNMC 和交大計中都大量使用 FreeBSD ,同時我們也在研究 OpenStack ,在 OpenStack 上跑 FreeBSD 能提供我們很多好處。同時,身為 FreeBSD 的使用者和支持者,當然希望更多人來使用,也擔心現在很多的使用狀況都是在 VM 裡頭,如果 FreeBSD 沒辦法在雲端環境下運行,就是多了使用上的限制,不利於 FreeBSD 的普及。

因此我,Iblis 和 Apua ,決定開始計劃來讓 FreeBSD 像各種 Linux 一樣在 OpenStack 環境下輕鬆順利的部署和運行。我們將計劃命名為鳳梨酥計劃!(這個名字讓我們笑了很久,會取這個名字是因為使用來自台灣的東西更可以凸顯這個計劃的發源)

鳳梨酥計劃基本上就是給 FreeBSD 用的 cloudinit

計劃分為兩大部分。一為 instance 的開機腳本,會在開機時讀取 OpenStack 的各種環境變數並依照環境變數來設定 instance ,這部分稱為 bsd-cloudinit ,做的事情和 Linux 上面的 cloudinit 相近。第二部分為 VM template 化腳本,在建立 template 的時候使用,負責移除 VM 的各種特徵,如 SSH host key ,以免屆時開新 instance 的時候 VM 的特徵重複。除此之外還要負責安裝 bsd-cloudinit ,我們將第二部分稱為 bsd-cloudinit-installer

命名

會開始做這件事情是想說,這件事情應該很簡單,但是卻沒有人做(我也很納悶為什麼沒有人做)。在 FreeBSD 上面做各類的系統管理只要用 CLI 就可以完成,我們要做的事情只是把外面的資訊拉進來,和這些動作黏在一起,就做完了。

剛開始我們就確立了一個方向,就是不要管 code 有多髒,能動就好。後來覺得這真的是正確的決定。由於不管架構、維護性等問題,我們很快就做出基本的功能。快速做出基本功能有一個重要的好處就是可以迅速獲得進度的回饋(你看,我們這麼快就做出這個功能了!),有進度就產生成就感,成就感對於計劃的繼續進行我認為很重要。要是我們顧慮很多,拖了很久還做不出第一個功能,因為沒有明顯的進度,心理上就很難產生成就感,很可能連第一個功能都沒做出來就不想做了。

計劃的命名也讓我們想了很久和笑了很久,剛開始我們提了一堆希臘神明之類的名字(因為拼起來很酷XD)。可是其實我一直覺得開源計劃的名稱應該要達到幾個目的:能夠顯示計劃的緣起、計劃的功能、好念、好記,再來還要看起來很酷很先進。

計劃剛開始我只有找 Iblis ,那天我給 Iblis 做 OpenStack 架構的簡報,Apua 走進來問我們要幹嘛,我就簡單講了一下然後附帶問了一句「要不要加入」,然後 Apua 就加入計劃了www

第一天我們就開始想名稱了哈哈,剛開始想了一堆希臘神明的名字,那天我剛好有帶鳳梨酥當點心,靈機一動就提出用鳳梨酥當名字XDD

鳳梨酥這名字超棒,首先,它顯示了我們的起源——台灣,只有台灣有這種點心。再來,它好念而且念起來很酷(對於不會中文的人而言),想像一個老外說 “feng li su" 的聲音XD

但是為了顯示計劃目標,我們還是再加了一個附標題:bsd-cloudinit

開發過程

幾乎都是以半 hackathon 的方式進行的,我們大概花掉幾個週末和平日晚上吧。

Iblis 負責用各種骯髒的方法用 shell script 實作各種動作,因為我們兩個都不會寫 Python ,Apua 提供 Python 支援,幫我了解 cloudbase-init 的架構,我比較了解 OpenStack 和 cloudinit 的架構,所以我要提供其他人方向,還有架構用以前弄好的 OpenStack 提供測試環境,還有負責 build template 、寫文件、去 mailing list 宣傳什麼的。

我們三人的領域都不太相同,但都互相稍微了解對方的領域。合作起來很愉快的一點就是一旦遇到問題就可以互相回答,像是不確定要用哪種實作的時候馬上就有人可以討論、分析和決定。不像我常常自己寫程式寫到一半沒辦法決定 implementation 就整個卡在那邊猶豫很久,要是猶豫太久就會開始打混了XD

成果

我們的計劃被加進 OpenStack Image Guide 了!超爽

下一步

最大的重點就是把 cloudconfig 的功能加進去,這樣才是真的自動化啊。

還有很多很髒的的地方要稍微修一修⋯⋯

鳳梨酥計劃主網站及說明文件

林正中數位電路實驗雜筆記

本篇內容乃道聽途說而來,目的在於快速了解數位電路實驗到底要怎麼做以及諸多抱怨,目前是很簡略地寫給自己看,要是有哪裡看不懂可以問,也歡迎修正內容。

暫且以編譯一詞代表 ncverilog -f

工作站是非常舊版的 Linux, vim 版本只有 6.3 超難用。

如果不用 screen 的話編譯到一半斷線編譯也會一起中斷,GG 。

在同一個資料夾內只能同時進行一次編譯(編譯進行中會產生鎖定檔來阻止另一個編譯同時進行),只要多複製一個資料夾就可以同時編譯了~

測試運行的方法:ncverilog 編譯 主檔案 TESTBENCH.v ,testbench 會 include PATTERN.v 和你寫的 module 進來,pattern 把資料餵進去你的 module ,然後檢查 module 的輸出。

假如這次你要實做的 module 是 decoder 好了。
Testbench 負責把 pattern 和 decoder 用線接起來。可以去看看,pattern 的輸出就是 decoder 的輸入。

01_run.f 這些檔案定義 macro, 讓 testbench 去 include 不同實做 level (behavior/dataflow/gate level)的 decoder 進來,有點像 makefile 。

要怎麼依照給定的 timing waveform 做出 pattern ?
(去看 PATTERN.v)initial 就是 t=0 (時間等於零啦)的時候,接下來可以用 # 符號表示等多少時間單位之後做什麼事情,例如 initial 輸出某特定值給 decoder,然後馬上檢查 module output 。
接下來 PATTERN.v 寫了 #5 ,就是維持目前 PATTERN module (PATTERN 本身也是一個 module )的輸出,5時間單位之後再繼續進行 #5 之後的動作,像是輸出另一組值給 decoder 以進行檢查。

大多數資訊都是由阿飄提供。
和認真好朋友修課都會變得認真起來。

這門課助教和老師提供的資訊都很 confusing ,很多資訊得要學生自己找、花時間理解。對於這種我沒什麼興趣的東西我才不會做這種事,要是沒有這麼認真的同學的話我早就放掉這門課了。後來意識到老師這樣(不論他是有意還是無意),也可以促進認真的學生自主學習,甚至鼓勵同學之間互相討論。對於從小拿到精美整理的教材的台灣學生來說這是一個轉變,這或許才是真的大學吧。不過對於本來就沒什麼學習動機的人這只會讓他們更傾向放掉這門課吧。(放掉的意思是蒙混敷衍過關,非認真學習而真懂)這樣的教學對於激起學習興趣大概也有負面影響。不過至少數位電路設計比起線性代數更容易看出實用價值太多了。

譯:電腦科學有哪些領域重數學?

源自 https://news.ycombinator.com/item?id=6503176

看到回應的論點我很喜歡,閒閒沒事就把它翻譯下來:

Q: 電腦科學有哪些領域重數學而且職缺很多?

我是一位正在考慮雙主修電腦科學和應用數學的大學生。我想找一個重數學的電腦科學領域來鑽研。我喜歡數學的實用性和簡潔,我正在尋找一個會用到各種數學的電腦科學領域。

我也傾向於選擇變動比較慢的領域,所以大概不會選像是資訊安全這樣的領域。

我知道圖形或機器學習應該是會用到很多數學的領域,而且職缺很多,但我希望得到更多建議。

A1: 我覺得你對電腦科學保持錯誤的期待,結果很可能令你失望。

現在很多地方需要程式設計師,好的程式設計師會花90%的時間寫程式。許多人,包含你都認爲圖形程式會用到很多數學,其實不然,你可以去看看 DOOM 的歷史和原始碼。雖然 DOOM 的程式在當時是頂尖科技,大部分的程式碼都是和數學無關的苦差事,讀寫檔案、網路通訊、高效能 array 和 string classes 、跨平臺、跨 compiler 的相容程式碼、除錯用程式碼……等等。Carmack (譯註:大概是 DOOM 的作者)確實懂很多數學,但是他八成更瞭解 C 語言。

數學或許在很多領域當中有幫助,甚至是必要的,但是如果你想的是成爲程式設計師(而非大學教職、學術研究人員),別指望數學會佔用你超過 10% 的時間,對大多數程式設計師而言,90% 的時間還是得要花在處理和數學無關的其他苦差事上面。