กู้ 2 factor authentication

ผมใช้ 2 factor authentication (2fa) มาได้สักสามสี่ปีแล้ว เนื่องจากวันนึงอีเมลผมโดนเด้งมาว่ามีการเข้าใช้จากประเทศแปลกๆ ผมก็รู้สึกไม่ปลอดภัย แต่ผมคิดรหัสผ่านใหม่เจ๋งๆ ไม่ออก กลัวจะลืมด้วย ก็เลยว่างั้นเปิด 2 factor เลยดีกว่า (ตอนนี้รหัสผมก็ใช้ password manager จัดการอีกที ก็ปลอดภัยขึ้นจากการเดารหัสแต่ถ้าไฟล์รหัสผมหลุดไปนี่ก็อีกเรื่องหนึ่ง ก็เก็บไฟล์ให้ดีๆ และตั้ง master password ที่ปลอดภัย)

ทีนี้วันนี้อยาก wipe rom ครับ ก็เลยกด wipe ไปโต้งๆ ด้วยความที่คิดว่า Authy มันมี backup ขึ้น cloud ให้อยู่ไม่ต้องกลัวอะไร ปรากฏว่า มัน backup ไม่ครบ และเป็นครั้งแรกที่ผมเจอว่ามันทำแบบนี้ (ครั้งก่อนผมได้คืนมาครบ) ก็เลยถึงคราวซวยที่ต้องมานั่งลิสต์แล้วครับว่าต้องทำอะไรบ้าง

จริงๆ ผมไม่ค่อยไว้ใจระบบ cloud สำหรับรหัสนะครับ ตัว Authy เองก็จะมีการเข้ารหัส backup ก่อนส่งขึ้นไปอีกทีนึง ก็เลยพอไว้วางใจได้อยู่บ้างแต่ถ้าเอาชัวร์ๆ คงต้องมาดูว่ามันเข้ารหัสแบบไหน ถูกหลักหรือเปล่า

– **Dropbox** อันนี้ไม่มีปัญหา ใช้ SMS รับได้ แต่ตอนนั้นผมเข้าค้างไว้อยู่แล้ว รู้สึกน่ากลัวมากๆ ตรงที่มันเปลี่ยนการตั้งค่า 2 Factor ได้โดยไม่ต้องกรอกรหัสซ้ำ
– **GitHub** ใช้ SMS รับรหัสได้แล้วก็เข้าไปเปลี่ยน (GitHub ใช้ sudo mode จะไม่ถามรหัสซ้ำในช่วงเวลาหนึ่ง ถึงจะตั้งให้ login ค้างไว้ก็อาจจะถามซ้ำได้)
– **Google** ใช้ SMS รับได้ ปัญหาคือ Android first boot รับ SMS ไม่ได้ ก็จะมีตัวเลือกคือให้โทรมาแทน โทรมาเป็นเบอร์ 081 เป็นภาษาอังกฤษและคุณภาพเสียงห่วยมาก

Google ถ้าเปิดปิด 2FA จะเด้ง login ที่ค้างอยู่หมดนะครับ ยกเว้นเครื่องที่กดปิด แต่ถ้าเปลี่ยนประเภทจากแอพเป็น SMS แบบนี้ไม่เด้ง และผมได้ยินว่าถ้าใช้มือถือก็ไม่ได้ด้วยต้องส่งเอกสารยึนยันให้ Google

– **Facebook** ใช้ SMS รับรหัสได้ แต่ผมรู้สึกแปลกๆ ตรงที่ถ้า sign in ได้แล้วบนมือถือ มือถือตัวนั้นจะกลายเป็น code generator ไปเลยทันที ซึ่งผมว่าไม่ปลอดภัยตรงที่ถ้าผมให้อุปกรณ์หนึ่งๆ เป็น 2FA ผมถือว่าผม trust อุปกรณ์นั้นสุดๆ แต่เครื่องชาวบ้านผม trust แค่ครึ่งนึง ถ้าเกิดมันดักรหัสผมก็ไม่ได้ OTP ไป นี่กลายเป็นว่ามันจะได้ OTP ไปด้วยก็ไม่ใช่
– **Amazon Web Service** ใช้ SMS ไม่ได้เลย มีแต่ทิ้งเบอร์ไว้ซึ่งสิบนาทีต่อมา Amazon โทรหาผม (เป็นภาษาอังกฤษ) ถามอีเมล, security question และเมลมาฉบับหนึ่งมีรหัสให้ผมอ่านให้ฟัง แล้วก็ปลดออกให้
– **DigitalOcean** ใช้ SMS เข้าได้ แต่ถ้าใช้ SMS เข้าแล้วจะปลด 2FA ถาวร ต้องเข้าไปตั้งค่าใหม่อย่างเดียว

(นี่ถ้าสักสองปีก่อนงานเข้าโคตรๆ เลยครับเพราะ TOT3G ไม่มีบริการไหนรองรับเลย ขอ OTP ผ่าน SMS ไม่ได้)

อื่นๆ ที่เคยเจอมาคือ Blizzard (battle.net) ถาม serial เกมในไอดี ซึ่งผมไม่มีเกมในไอดีนั้น ก็เลยบาย ปิดทิ้งสมัครใหม่ง่ายกว่า

สรุปแล้วใช้ 2 factor ไม่ค่อยจะมีปัญหาตรงทำแอพพังเท่าไรครับ เพราะใช้ SMS ได้หมด ก็จะมีแค่ Amazon เท่านั้นแหละที่เป็นปัญหา

ปล. service หลายๆ ตัวจะมี backup code นะครับที่ใช้แทน 2FA แต่ผมไม่ได้ print มาเพราะไม่รู้จะเก็บไว้ที่ไหนให้ปลอดภัย คือไม่อยากไว้โต๊ะคอมมันเหมือนเขียนรหัสผ่านแปะหน้าจอ

myHTC

หลายเดือนก่อน HTC Thailand เปิดตัว HTC Desire ซึ่งมาพร้อมกับโปรแกรม myHTC ซึ่งเอาไว้แข่งกับ BB โดยเฉพาะ ปรากฎว่าเขาเขียนไว้ชัดเจนว่าเฉพาะเครื่องศูนย์ประเทศไทยเท่านั้น ผมเองเลยสงสัยว่า ผมอยากได้ Nexus One เนี่ย ศูนย์ไม่เอามาขายเอง งั้นผมก็ hack ซะ ก็เลยดาวน์โหลดมาติดตั้ง โดยโหลดจาก [myhtcsite.com/apk](http://myhtcsite.com/apk)

หลังจากติดตั้งเสร็จแล้ว มันเป็น widget ก็ add ไปตามปกติครับ

เพิ่ม Widget

ใส่ไปปุ๊บ ก็ขึ้นหน้านี้ทันที

หน้าลงทะเบียน

จริงๆ ผมหา Shop ID จากเว็บนึงที่เค้าไม่ให้แจกได้นะครับ แต่ถึงใส่เข้าไปก็จริงแต่…

Error

ดังนั้น ในเมื่อเข้าประตูหน้าไม่ได้ ก็ต้องประตูหลังครับ

adb shell
sqlite3 /data/data/com.js.htc/databases/myhtc

*อ้าว เฮ้ย Java เค้าให้ใช้แพคเกจตามโดเมนที่ตัวเองเป็นเจ้าของนะครับ นี่มันอะไรใช้โดเมนคนอื่น คุณภาพระดับนี้ Market ไม่รับแน่ๆ ถึงไม่ยอมให้ device อื่นใช้*

sqlite> .schema
CREATE TABLE android_metadata (locale TEXT);
CREATE TABLE tbads (_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,add_id NUMERIC ,ad_desc TEXT,ad_count INTEGER DEFAULT 0 ,ad_max INTEGER DEFAULT 0 ,ad_promo TEXT,appg_id INTEGER, ad_click INTEGER DEFAULT 0, ad_promotype INTEGER DEFAULT 0, ad_expire DATETIME);
CREATE TABLE tbapps (app_id INTEGER PRIMARY KEY NOT NULL , app_name VARCHAR(100), app_desc VARCHAR(200), app_thumb VARCHAR(50), appg_id INTEGER, app_package VARCHAR(100), app_rev INTEGER, app_vername VARCHAR(15), app_status INTEGER);
CREATE TABLE tbdevice (shop_id VARCHAR(20), pincode VARCHAR(20), age INTEGER, genger INTEGER, lastsync_app DATETIME);

อ๊ะ tbdevice น่าสนใจ ไหนลอง

sqlite> .dump tbdevice
PRAGMA foreign_keys=OFF;
BEGIN TRANSACTION;
CREATE TABLE tbdevice (shop_id VARCHAR(20), pincode VARCHAR(20), age INTEGER, genger INTEGER, lastsync_app DATETIME);
COMMIT;

ไม่มีอะไรเลย ไม่เป็นไร ยัดไปเลยดีกว่า

sqlite> INSERT INTO tbdevice VALUES(“omgwtflolroflcopters”, “M79AKAC4”, 0, 0, NULL);
sqlite> .quit

แล้วก็ add widget ไปอีกที…

แจ่มมม !!
Chat ได้ด้วย

ปัญหาคือ ผมขอให้เพื่อนที่ใช้ Tattoo add เข้ามา ปรากฎว่าใช้ไม่ได้ ก็เลยไปนั่งแกะทาง backend อยู่นาน จนได้ pin มาอันนึง แต่มันทำกี่ที่ได้เลขเดิมเพราะมันล็อคกับ IMEI ครับ วิธีการที่หาคือ ผมติดตั้ง proxy server ไว้ใน server โดยเลือก privoxy จากนั้นให้มัน log request เต็มรูปแบบ แล้วผมก็กด register จะได้ URL มา ผมก็นั่งเดาอยู่นาน จนพิมพ์ผิดทำให้ argument ตกหายไปหมด ทีนี้ดันได้พินออกมา -*- (เจ๋งจริงๆ security เทพสุดในสามโลก)

ครั้นแล้ว ยังไม่สะใจ เอางี้ดีกว่า..

อ๋อ ได้…

sqlite> UPDATE tbdevice SET pincode=”S0000001″;
sqlite> .quit

(เวลาทำ อย่าลืม kill ตัว myHTC ทิ้งก่อนนะครับ ผมไม่นิยม task manager ก็ใช้ปุ่ม force stop ใน applications setting ได้)

ดี สม

(เนื่องจากว่าผมไม่ได้ต่อผ่าน proxy อะไรเลยไม่อยากแก้อะไรนะครับ ถ้าหาได้แล้วเดี๋ยวอาจจะเอา @petdo ใส่แทนเห็นคล้ายๆ กัน ;P)

เรื่องนี้สอนให้รู้ว่า Login ต้องมีรหัสเสมอนะครับ และ อย่าเชื่่อ user ^^

ปล. myHTC ใช้ polling อะ ผมว่าเด็กป. 6 ก็วางระบบระดับนี้ได้นะ (ใช้คำว่า วาง ไม่ใช่ เขียน แต่ถ้ารู้จักการใช้ภาษาต่างๆ แล้วง่ายนิดเดียว) สากลโลกเค้าใช้ socket กันแล้วคร๊าบบ

ปล2. จริงๆ แล้วสามารถเปลี่ยนเป็น PIN ใครก็ได้นะครับ จะได้ contact กับ status เค้ามาด้วยเลย เรียกได้ว่าแค่ใส่ pin เข้าไปก็ปลอมตัวได้แล้ว แจ่มไหมหละ