ระบบกรอง Spambot แบบ text-mode


เป็นไปได้หรือไม่ที่จะสร้างระบบกรอง spambot แบบ text mode ?

สืบเนื่องจาก blog กระทู้ก่อนหน้า

http://gotoknow.org/blog/wwibul/40340 

มีเรื่องค้างคาใจที่ยังแก้ไม่ได้โดยง่าย บางระบบที่ค่อนข้าง 'หลุดเทรนด์' อาจไม่สามารถใช้ open-souce utility มาช่วยได้ ซึ่งอาจทำให้ webboard จำนวนหนึ่ง ต้องล้มหายตายจากไป

ในฐานะที่ผมต้องรับผิดชอบอยู่หนึ่งบอร์ด ผมไม่ยอม

ปรกติเราเข้าไปในห้อง ถ้าเข้าไปคนเดียว ยุงทั้งห้องจะรุมเรา

แต่ถ้าเข้าไปหลาย ๆ คน จะช่วยแบ่งเบากันได้ ('มียุงร่วมเสพ มีเลือดร่วมต้าน')

เพื่อปกปักเพื่อนร่วม(หาร)ชะตากรรม ผมจึงขอกลับมาต่อภาค 2

ฐานบท (เอ้อ .. หมายถึงข้อสมมติพื้นฐาน หรือที่เขาแปลกันว่า Assumption):

1. ระบบ spambot เป็น bot ขนานแท้

2. bot ที่ว่านี้เป็น webboard-bot

3. bot นี้ ไม่ใช่รุ่นไทยประดิษฐ์

4. bot นี้เป็น bot ที่เขาสร้างแบบกลาง ๆ ให้ใช้ได้ทั่วโลก

5. bot นี้ไม่ได้ใช้ heuristic ที่ฉลาดระดับอัจฉริยะ

ถ้า Assumption เหล่านี้เป็นจริง ผมเชื่อว่าเป็นไปได้ทางทฤษฎีที่จะหาทางรับมือได้โดยใช้เทคโนโลยีแบบ text mode

text mode เขียนโปรแกรมง่าย สามารถแฝงมิติทางวัฒนธรรมเข้ามาได้อีกต่างหาก  ซึ่งระบบปัญญาประดิษฐ์ยังไม่น่าจะโตทันในช่วงเวลาอันสั้นนี้ และกรองทิ้งคนที่ไม่คุ้นกับภาษาและวัฒนธรรมไทยออกไปได้ ระดับหนึ่งด้วย

แนวคิดหลักในการออกแบบ: 

โดยทั่วไป ระบบที่ใช้ได้ผลดีคือ graphic mode เพราะคุณสมบัติ asymmetric mapping ของตัวเลขไปเป็นภาพตัวเลข นั่นคือ สมมติผมนึกเลขขึ้นมาชุดหนึ่ง ผมเขียนลงกระดาษ ตัวเลขนี้จะกลายเป็นกลุ่มของจุดมากมาย ซึ่งในมุมมองของ bot ทั้งหลาย มันควรจะงงเพราะมันต้อง mapping กลุ่มของจุดคืนรูปไปเป็นตัวเลข ซึ่งถ้าใครสามารถทำแบบนี้ได้ดี แทนที่จะเขียน bot เลี้ยงชีพ เขียน OCR แปลงลายมือขายจะรวยเร็วกว่า

asymmetric mapping คืออะไร ยกตัวอย่างง่าย ๆ สมมติผมมีความสัมพันธ์

           y = 0.78 x ln x

ถ้าผมกำหนด x ขึ้นมา ผมสร้าง y ง่ายนิดเดียว แค่แทนค่า

แต่ถ้าผมทราบ x และ y ใด ๆ มาเป็นตัวเลข ต่อให้ทราบหลายชุด ถ้าไม่ทราบความสัมพันธ์มาก่อน ผมก็คงต้องนั่งงมกันนานกว่าจะหาความสัมพันธ์พื้นฐานออกมาได้ และต่อให้ทราบความสัมพันธ์ กว่าผมจะทำ regression เพื่อดึงค่า 0.78 กลับออกมา ก็ไม่ใช่เรื่องง่ายนัก

การที่มีชุดสมการและชุดค่าคงที่ ผมสร้างคู่ลำดับ x,y ง่าย

แต่ต่อให้ผมทราบคู่ลำดับ x,y ผมก็ต้องเสียเวลานานกว่าจะ reverse numerating ได้คืนออกมาเป็นชุดสมการพร้อมค่าคงที่

นั่นคือ asymmetric mapping คือการที่แปลงไปด้านนึงง่าย แต่แปลงกลับมาย๊าก..ยาก

แบบนี้เป็นเหมือนการว่ายตามน้ำและว่ายทวนน้ำ

โปรแกรมเมอร์ของระบบเป็นผู้กำหนดความแรงของกระแสน้ำ

bot เป็นนักว่ายน้ำ

เมื่อเรารำคาญมัน เราก็สั่งให้น้ำไหลแรง ๆ อยากเข้ามาก็เชิญว่ายทวนน้ำซะให้เข็ด

แนวคิดของเราคือแทนที่จะสร้างกลุ่มของจุด ผมก็อาจสร้างกลุ่มของข้อความขึ้นมาแทน ให้มีคุณสมบัติต่อไปนี้

1. มีคุณสมบัติแบบ asymmetric mapping

2. เพื่อกรอง bot ที่ฉลาดมากจนสามารถ reverse enumerating ออกไปได้ ผมก็อาจใส่ 'ความกำกวม' ลงไปเพิ่ม เหมือนอย่างที่เราเห็น GotoKnow แสดงตัวเลขเอียงโย้ไปเย้มาให้เราดูนั่นแหละ คือ bot ต้องฉลาดมากจนอ่านลายมือคนได้ จึงจะทะลวงปราการด่านนี้ (graphic mode) ได้ เพียงแต่ในที่นี้ เราจะใช้วิธี mapping ไปเป็น text mode แทน

3. คุณสมบัติที่สำคัญคือ ต้องเป็นระบบที่คนอ่านเข้าใจ แต่ระบบปัญญาประดิษฐ์อ่านไม่เข้าใจ ถ้าให้ดีกว่านั้น ให้คนไทยอ่านเข้าใจ ชาติอื่นอ่านแล้ว 'ฮุนฮง' เพื่อลดโอกาสต่างชาติมาร่วมวง ดังนั้น จึงอาจใส่ 'อารมณ์ขัน' แบบไทย ๆ ลงไปเพิ่มด้วย

ข้อ 2 กับ 3 นี่ ถ้ายุบรวมกันได้ ก็ยิ่งดี

ตัวอย่างของระบบ

ความเป็นไปได้มีหลากหลายมาก เขตสิ้นสุดอยู่ที่ระดับจินตนาการ 

ในที่นี้ผมขอยกตัวอย่างระบบแปลงตัวเลขเป็นข้อความ

ลองนึกดู 1021 แปลงเป็น 'หนึ่งพันยี่สิบเอ็ด'

เขียนโปรแกรมแปลงเลขเป็นข้อความ ไม่ยาก

แต่ทำกลับกันนี่ ผมคงหงอกไปสัก 1 เส้น

ยังครับ ยังไม่หนำใจ

เราจะแปลงต่อ เพิ่มความกำกวม (ความ 'เบลอ') จาก 'หนึ่งพันยี่สิบเอ็ด' ไปเป็น 'หึ่งฮันคี่หิบเห็ด" ก็ได้  หรือ "หนึ่งพานเย่เสบเก็ด" ก็ได้ (ตรงนี้ต้องไหว้วานครูภาษาไทยสอนเรื่องเสียงสูง เสียงกลาง เสียงต่ำ ให้หน่อยแหละ จะได้แปลงแล้วฟังเนียนหู ฟังปุ๊บนึกเป็นตัวเลขได้เลย)

ถ้าบรรลุถึงขั้นทำร้อยรอบ ไม่ซ้ำกันสักรอบนี่   ก็คงไม่เป็นเหยื่อให้เคี้ยวได้สะดวกปากเหมือนเมื่อก่อนอีกต่อไป bot รุ่นที่อีเดียตหน่อย อาจเดี้ยงตั้งแต่ยกแรก

ความ'เบลอ'นี่แหละ ที่จะปราบเซียนได้ เพราะปรกติแล้ว การเขียนโปรแกรมให้วิเคราะห์สถานการณ์ที่มีรูปแบบตายตัว ไม่ยากนัก แต่ถ้าเจอรูปแบบดิ้นได้ การตีความจะยากขึ้นนับสิบ ๆ เท่า

แต่ไม่ว่าผมใช้ระบบ text mode หรือ graphic mode จุดโหว่เบ้อเร้อก็ยังอยู่ เช่น หากใช้ระบบตัวเลข 5 หลัก เรารู้ว่ารูปแบบที่เป็นไปได้ของการผสมคำคือ 10 ยกกำลัง 5 หรือ 1 แสน ซึ่งตามหลักสถิติของการเดา ถ้าเดา 1 แสนครั้งในกรณีนี้ จะมีครึ่งนึงจะผ่านด่านนี้ได้ ! และถ้าเดาถึง 7 เท่าของค่าเฉลี่ย (นั่นคือ ในกรณีนี้เท่ากับ 7 แสนครั้ง) ในทางปฎิบัติเกือบจะเรียกได้ว่า ผ่านแน่ ๆ (เพราะจะมีโอกาสน้อยกว่า 1 ในพันล้านที่ผ่านไปไม่ได้ ตัวเลขนี้คือส่วนหางของโค้งแจกแจงปรกติตั้งแต่ Z = +6 ถึงอนันต์) ดังนั้น หากมันใช้วิธีโจมตีแบบหักโหมไปเรื่อย ๆ ยังไงก็ผ่านแน่สำหรับระบบตัวเลข 5 หลัก (ดังที่มีผู้ตั้งข้อสังเกตุไว้ว่ามันผ่านไปได้นิดหน่อยทั้งที่มีระบบป้องกัน ซึ่งทำให้สงสัยว่าเป็นฝีมือคน แต่ผมมองว่าอาจเป็นได้ทั้งคนหรือ bot)

ดังนั้น ทางออกคือแทนที่จะใช้ตัวเลขซึ่งแต่ละหลักเป็นไปได้แค่ 10 แบบ ก็อาจผสมตัวอักษรด้วย เช่น a-z, A-Z และเครื่องหมายต่าง ๆ ซึ่งสมมติว่าเพิ่มความหลากหลายขึ้นมาได้ได้เป็นหลักละ 70 แบบ ระบบรหัสผ่าน 5 หลัก ก็จะมีจำนวนรูปแบบการผสมคำกลายไปเป็น 70 ยกกำลัง 5 หรือประมาณ 1680 ล้านแบบ (ดีกว่าเดิมราวหมื่นเท่า) ซึ่งทำให้การโจมตีแบบหักโหมไม่คุ้มอีกต่อไป (จ้างคนแบบ outsource คุ้มกว่า)

(ถ้าเราเน้นใช้แต่ภาษาไทย ต่อไปการ outsource เพื่อแปะสแปมก็ต้องเบนเข้ามาในประเทศ เป็นการสร้างงานให้คนไทยที่ว่างงาน ผลประโยชน์เต็มเม็ดเต็มหน่วยก็จะตกกับคนไทย อือม์..ไม่เลวแฮะ เป็น win-win situation เชียวนะนี่)

ถ้าเราเป็นกวางน้อยที่ใสซื่อ โดนเสือใจร้ายคาบไปหม่ำ ก็ขอเอาคืนด้วยการทำตัวให้เนื้อเหนียวหนึบเถิด ให้มันปวดเหงือกเล่นก็ยังดี ถ้าได้ถอดฟันคม ๆ มาเป็นที่ระลึกสักซี่ได้ก็ยิ่งประเสริฐ

ถ้า bot ยังทะลวงตรงนี้ไปได้ เราก็ยังสร้างระบบรองรับแบบสานเป็นตาข่าย ซึ่งอาจไม่เกี่ยวกับ user ทั่วไป เช่น ทำ content analysis แล้วลบอัตโนมัติ โดยยอมให้ข้อความดี ๆ ส่วนน้อยเสียหายอัตโนมัติ แลกกับการสลัดทิ้งจาก bot พวกนี้ เพราะสแปมมันมีลักษณะเฉพาะตัวคือชี้ออกไปหา web ข้างนอก ดังนั้น มีจะมี'ลักษณะเฉพาะตัว' เช่น มีคำว่า http://, [url, <a href ฯลฯ อยู่ชุกชุม ซึ่งสามารถเขียน script วิเคราะห์ว่าข้อความใดมีความหนาแน่นของชิ้นส่วนคำดังกล่าวชุกผิดปรกติ ก็โซ้ยแบบเงียบ ๆ ได้โดยระบบ

ระบบที่ว่านี้ ผมเชื่อว่าเป็นไปได้ และน่าจะพัฒนาได้เร็ว โดยปรับใช้จากสิ่งที่มีอยู่ในมือ เช่น โปรแกรมออกใบเสร็จที่แปลงตัวเลขเป็นข้อความ (ถ้าจำไม่ผิด เคยเห็น source code ของฟังก์ชันชื่อ Thaibaht แปะไว้ใน pantip อยู่เนือง ๆ) น่าจะปรับนิด ๆ หน่อย ๆ แล้วใส่ 'ลูกบ้าห้าร้อยจำพวก' ลงไปหน่อย เพื่อให้เกิดความ 'เบลอ' ผมเชื่อว่าจะเป็นระบบที่ใช้แก้ขัดได้ - อย่างน้อยก็สักระยะ 

อย่าลืมว่าควรเลี่ยงระบบที่มีแต่ตัวเลขน้อยกว่า 6 หลัก เพราะไม่ปลอดภัย ถ้าให้ดี ควรรองรับอักขระภาษาอังกฤษได้ (เผื่อคนไทยในต่างแดนไม่มีคีย์บอร์ดภาษาไทยใช้)

 

หมายเลขบันทึก: 42622เขียนเมื่อ 4 สิงหาคม 2006 17:15 น. ()แก้ไขเมื่อ 14 มิถุนายน 2012 13:39 น. ()สัญญาอนุญาต: จำนวนที่อ่านจำนวนที่อ่าน:


ความเห็น (7)
แนวคิดของอาจารย์น่าสนใจมากครับ

ตอนนี้การสร้างภาพที่ใช้ตรวจสอบว่าไม่ใช่ spambot ของ GotoKnow.org นั้นเพิ่ม load ให้ระบบไม่น้อยครับ

ภาพตรวจสอบเราสร้างใหม่ทุกครั้งครับ โดยมีการสุ่มองศาในการเอียงตัวเลข ทำอย่างนี้กิน load ไม่น้อยทีเดียว

ถ้ามีโอกาสผมจะทดลองทำให้ผู้ใช้พิมพ์ตัวเลขโดยออกต้นแบบมาเป็นแบบ"ซามเจดนึงฮก" น่าจะลด load แถมสนุกดีด้วยครับ

อ้า.. หาภัยมาใส่ผมซะแล้วมั้ยล่ะ

เกิด gotoknow ล่มไปเพราะการนี้ ผมโดนรุม 'ตึ้บ' แน่..

แต่ก็น่าลองดูนะครับ ปรกติผมพูดทีเล่นทีจริง แต่ก็จริงใจนะครับ..

(บ๋อย ! ขอกระโถนด่วน !)

เมื่อเช้า บล็อกอาจารย์หมอวิจารณ์เจอ spammer คนจีน http://gotoknow.org/blog/tutorial/42651 ได้เจอของจริง เลยอยากสนับสนุนไอเดียอาจารย์วิบุลค่ะ

แหม ผมก็เขิลลลลเป็นนะ

[ม้วน 3 ตลบ] 

(บ๋อย ! กระโถนมาอีกที่นึง ด่วน !)

เอางี้ (เปลี่ยนเป็นหน้าหล่อ)

ควรสร้าง graphic mode ควบคู่

แต่ไม่ใช้ graphic mode

ผู้ใช้ ให้ป้อนระบบ "ซามเจะหนึ่งโหะ"แทน โดยไม่ต้องดู graphic mode แต่อย่างใด

bot ทั่วไป หรือคนต่างชาติที่อ่านภาษาไทยไม่แตก เจอแบบนี้คงจะงง เพราะเท่ากับว่า เรามีระบบลวงไว้ดึงดูดความสนใจของแก๊ง bot ได้

คงลดความหนาแน่นของพวกยุงรำคาญพวกนี้ไปได้ระดับหนึ่ง

ว่าแต่..ผมจะโดนผู้ใช้ gotoknow ด่าเละไหมนี่

ไม่อยากนึกถึงอนาคตเลยแฮะ

พอดีนึกออกอีกปัญหานึงหากจะใช้ text-mode ครับ เนื่องจากระบบเรา open-source คราวนี้พวก spambot ก็ไม่ต้อง reverse engineering สูตรเพราะดูจาก source code ของเราได้เลย

spambot พวกแรกที่จะมาอ่าน source code เราคือพวกรุ่นไทยประดิษฐ์นี่ละครับ เพราะ GotoKnow ได้ rank จาก Google ดีมาก

ส่วนแบบ graphic-mode นี่แม้ว่าจะเห็น source แต่ก็ต้องทำ image recognition อยู่ดีถึงจะเจาะเข้ามาได้

เรื่องนี้เป็นโจทย์ที่น่าสนใจมากครับ เพราะแบบ text-mode น่าจะช่วยลด load ได้เยอะ แต่ว่าจะทำแบบ text-mode แล้วแม้จะเห็น source code ก็เจาะไม่ได้นี่สิเป็นโจทย์น่าคิดครับ
สิ่งที่เรามองอีกอย่างนึง คือ เนื่องจากเรา open source แก่คนทั้งโลก ดังนั้นต้องดูเรื่องของการ generalize ของ source code ด้วยค่ะ ... ก็คงเป็นโจทย์น่าคิดอีกอย่างของการพัฒนาระบบแบบ open source

คุณสมบัติของ asymmetric mapping ที่ดี จะต้องมีความลำเอียงสูงมาก จนถึงจุดที่ว่า ต่อให้เห็นกระบวนการสร้าง ก็ไม่มีปัญญาแกะคืนมา  

กรณีสมมติ 

สมมติว่าผมขึ้น message ว่า

"อะไรเอ่ย สี่ตีนเดินมา..."

ผู้ใช้พิมพ์คำว่า "เต่า"

กระบวนการสร้างคือ ให้หยิบวลีสุ่มจากคลังวลีในฝั่ง server มาใช้

ในกรณีนี้ จัดเป็น asymmetric mapping เพราะในสายตาของ bot วลีนี้ก็เทียบเท่าขยะชิ้นหนึ่ง เพราะแคะอะไรไม่ออกเลย

มันเห็นคำว่า "สี่" มันก็คงกรอกเลข 4 เข้า้ไป  ซึ่งก็ไม่มีความหมาย

ที่แคะไม่ออก เพราะมันไม่ได้ encrypt ด้วย algorithm แต่มันถูก encrypt ทางวัฒนธรรม .. คนรู้ แต่ bot ไม่รู้

ในแต่ละชนชาติเขาก็มีวลีทำนองนี้ของเขา ที่คนต่างวัฒนธรรมเห็นเต็มตา แต่ไม่เข้าใจ ไม่สื่อ

คลังวลี แต่ละชาติก็จะไม่เหมือนกันในเรื่องของ user-defined content

แต่โครงหลักนำไปใช้จะเหมือนกัน คือผู้ดูแลระบบต้องสร้างคลังวลีขึ้นมาเอง

นั่นเป็นตัวอย่างหนึ่ง แต่ไม่น่าเล่น เพราะเป็นภาระของโปรแกรมเมอร์มากไป 

อีกอย่าง ผมมองต่างออกไปนิดหน่อยครับ เรื่อง open source

ขอยกตัวอย่างเป็น pseudocode อย่างนี้นะครับ

procedure showblog

    {

    myOption = "fuzzy Thai";

    AntispamMode = myOption;

    call getbloginput (AntiSpamMode);

     }

 procedure getbloginput

     {

      if antispammode="default" then

            call checkspamdefault;

      elseif antispammode="fuzzy thai"  then

       call checkspamfuzzythai;

      end if

      }

ในกรณีนี้ ถ้าเขาเอาไปใช้แบบ open source เขาก็สามารถ compile และใช้ได้เลย หาก webblog เขาไม่มี rating สูง เขาก็ไม่เดือดร้อนในการใช้ default

แต่ใครที่ต้องการความแข็งแกร่งทนทานต่อการการโจมตี ก็ยังมีช่องว่างให้ขยับขยายเฉพาะในส่วน security ที่ผู้ใช้สามารถพัฒนาขึ้นมาเฉพาะกิจ โดยมีหมายเหตุในทุกส่วนที่เกี่ยวข้องว่าเฉพาะเรื่องนี้ ผู้ใช้สามารถต่อเติมเองได้ตามกฎ กติการที่วางไว้

พูดง่าย ๆ คือ เรามี security สำเร็จรูปที่ดีปานกลางให้ทุกคนใช้ รวมทั้งตัวเรา แต่ถ้าใครยังไม่พอใจ (ซึ่งก็รวมถึงตัวเราเช่นกัน) ก็ปรับเพิ่มไม่ยาก แค่นิยาม user-defined function ส่วนตัว และปรับให้มีการเรียกใช้ออกไปแทนที่จะใช้ของสำเร็จรูปที่มีอยู่เดิม

พบปัญหาการใช้งานกรุณาแจ้ง LINE ID @gotoknow
ClassStart
ระบบจัดการการเรียนการสอนผ่านอินเทอร์เน็ต
ทั้งเว็บทั้งแอปใช้งานฟรี
ClassStart Books
โครงการหนังสือจากคลาสสตาร์ท