[CodeMania101] Coding Security

จริงๆ มางาน Code Mania 101 เพราะ Session นี้เลยครับ เนื่องจาก Project ที่ยื่นเข้าประกวดล่าสุดติดปัญหาทาง Technical เยอะพอสมควรเลย และเรื่อง Security เป็นหนึ่งในนั้นครับ สำหรับ Session เป็นกูรูด้าน Security พี่นฤดม รุ่งศิริวงศ์ ครับ

Software Security Fundamental

  • ส่วนใหญ่อะไรที่เป็น Fundamental คนมักจะข้ามกัน  ไป Advance ให้มันตรงกับงานที่สนใจก่อน พอเจอปัญหาแล้ว เราถึงกลับมามองที่ Fundamental

Security

  • Security ภาษาไทยแปลตรงตัวเลย "ความมั่นคง" ซึ่งมันมั่นคงอย่างไร มันมีการแจกแจงเฉพาะเจาะจงลงไป เช่น Operation, Network, Physical และอื่นๆครับ
  • แต่ในตอนนี้เจาะลงไปในส่วนของ Information(ข้อมูล) โดยต้องมอง 3 state ทั้งในส่วนของ Software และ Hardware
    • Use - การใช้
    • Store - การจัดเก็บ
    • Transmit - การขนส่ง (ส่วนใหญ่เน้นอันนี้กันเยอะ)

Software Security (3R)

  • Reliability - Function งาน ใช้งานแล้วมันน่าเชื่อถือได้ หรือป่าว
  • Resiliency- Software เนี่ย มันยืดหยุ่น สามารถรองรับอะไรแปลกๆ พิสดาร ได้ในระดับนึงไหม
    • Intentionally - attack expliots
    • Accidentally - user error
  • Recoverability - พังแล้ว กู้คืนมาใช้ได้ไหม

Security Concept

  • สำหรับผมมันเป็น Framework แล้วให้แต่ละองค์กรไปทำ Assessment และดูว่ามีตรงกับ Framework หรือยัง ?
  • ส่วนแรก Core (CIA)
    • Confidentiality - Authentication: มีสิทธิไหม
    • Integrity - Authorization: ได้รับอนุญาติ หรือป่าว
    • Availability - Accountability: พร้อมใช้งาน ในหน้าที่ที่ได้รับ
  • ส่วนแรก Design (อันนี้ขึ้นกับคน และกระบวนการและ) เนื่องจากเวลาที่จำกัดทางวิทยากรเลย ยกตัวอย่างที่สำคัญมาอธิบายครับ ได้แก่
    • Least Privilege - ใช้สิทธิเท่าที่จำเป็น ไม่ต้องเผื่ออนาคตเยอะ
    • Separation of duties - มีหน้าเอาไว้ตรวจสอบ คานกัน เข้าใจว่าฝั่งการเงินใช้เยอะ พวกการทำรายงาน และการอนุมัติรายการ เป็นต้น
    • Defense in Depth - ไม่มีอะไรดีที่สุด ขนาดประตูในบ้านของแต่ละห้อง เรายังต้องทำกุญแจไว้ ระบบก็ควรมี ไม่ใช้ว่ามีกุญแจแล้ว กลายเป็นพระเจ้าของระบบเลย
  • Security ไม่ได้ขึ้นกับทีม Network หรือ System ใน Code ของระบบงานต้องมีการป้องกันด้วย อย่างการโจมตีผ่านทาง Business Process ที่มีช่องโหว่
  • Quality Attribute - Security เป็นปัจจัยหนึ่งที่ต้องสนใจ ที่ต้องสนใจตั้งแต่ช่วงแรกของการพัฒนาระบบ ถ้าพลาดไปแก้ไขในภายหลังมีค่าใช้จ่ายสูงมาก

Coding Security Practices

1. Input Validation

อะไรที่เป็น Input บ้าง ? - ทุก Byte ที่ส่งไป Server ไม่ใช้จากหน้า UI อย่างเดียว รับบ้อมูลที่ตกลงกันได้ที่ลักษณะ formal(เป็นทางการ มีการตกลงกันไว้) และจัดการกับข้อมูลที่ผิดได้

มี 2 แบบ

  • Syntactic - ตาม Pattern มักใช้ Regular เช่น เลขบัตรประชาชน (อันนี้ตรวจจับง่าย)
  • Semantic - ตาม Business Logic ตรงนี่พวก Tools/HW ฝั่ง Security ตรวจสอบไม่ได้ เช่น การโอนเงิน ซึ่งภายในมีลำดับกระบวนการของแต่ละธุรกิจซ่อนอยู่

ควรป้องกันในด้านแรก ทำกันให้ได้ในด้านแรกๆเลย แล้วควรทำที่ไหน ถ้ามี Client และ Server

  • Client-Side - เร็ว เน้น User Experience
  • Server-Side - กันอีกขั้น ป้องกันการปลอม Request ส่งข้อมูลเข้ามา

Implementation Guideline

  • Data Type Validation
  • Schema Validation JSON XSD
  • Range Validation
  • Pattern Validation -Regular Expression
  • White List vs Black List - ใครทำอะไรได้ เช่น กำหนดใน XSD Schema

ทำแล้วได้อะไร -Comply with

  • OWASP Top 10 2013: A1(Injection) / A3 (Cross-Site Scripting (XSS))
  • OWASP Mobile Top 10 2016: M7 (Client Slide Injection)
2. Output Handling

อะไรที่ต้อง Clean บ้าง ? - ทุกอย่างที่ออกจากระบบ โดย Output ที่ออกจากระบบของเรามีคุณภาพ ไม่มีปัญหากับระบบอื่นๆ ที่นำข้อมูลไปใช้งานต่อ เวลาทำเรื่องนี้ควรทำที่ฝั่ง Server เพราะมันน่าเชื่อถือมากกว่าง

มี 2 กลยุทธ์ที่ใช้

  • Sanitization - Clean Data ให้เรียบร้อยก่อนส่งต่อ เช่น
    - remove tag หรือ remove อะไรที่อาจจะสามารถไป Execute ได้เป็น เช่น SQL. XML เป็นต้น
    - Filtering - ตัด Data ที่มีปัญหาทิ้งไปเลย
  • จัดการเรื่องของ Encoding ให้เรียบร้อย

ทำแล้วได้อะไร -Comply with

  • OWASP Top 10 2013: A1(Injection) / A3 (Cross-Site Scripting (XSS))
  • OWASP Mobile Top 10 2016: M7 (Client Slide Injection)
3. Parameterized Queries
  • SQL ควรเป็น SQL ที่ได้จากระบบ ไม่มีข้อมูล หรือคำสั่งแปลก เข้ามาเสริม หรือเพิ่มเติมได้
  • อย่าสร้างเอา SQL Command แบบต่อ String  เพราะ ตัว Query สามารถถูกแก้ได้
  • ทางแก้ การทำ Parameterize ซึ่งในทุกภาษารองรับอยู่แล้ว ซึ่งการทำแบบนี้เป็นการ Lock ให้เอาข้อมูลมาหยอดลองตาม Pattern ไม่สามารถแทรกคำสั่งได้ หรือถ้าแทรกไปได้ มันผิด Syntax ไม่สามารถที่จะ Execute ได้
  • ใน ORM ส่วนใหญ่มีการทำให้เรียบร้อยแล้ว แต่อาจจะมีกรณีที่ Query มัน Advance มากๆ แล้ว ORM Framework ยอมให้ Query ตรงๆ อย่าง Hibernate ยังมี HQL เคสนี้ DEV ต้องจัดการกับ Query ดีๆครับ

ทำแล้วได้อะไร -Comply with

  • OWASP Top 10 2013: A1(Injection)
  • OWASP Mobile Top 10 2014: M1 (Weak Server Side Controls)
4. Identity and Authentication Control

Three Term

  • Authentication การยืนยันตัวตน เป็นผู้ที่มีสิทธิเข้าระบบ มาทำงานบางอย่างได้
  • Session Management - เจ้า Session  มัน คือ จัวเป็น State ของฝั่ง Server พยายามให้ Session  ใช้ได้ในช่วงเวลาหนึ่งพอ เช่น Login ได้ปุบ ทำลาย Session ทิ้ง แล้วสร้างอันใหม่สำหรับงานถัดไป
  • Identity Management - ผมมองว่าเป็นงานด้านพวก Policy หรือ Process นะ ที่ทำยังไงให้มันมั่นคง เช่น
    - เปลี่ยน Password ต้องมีขั้นตอนอย่างไร
    - งานที่มันสำคัญมากต้องมีการ Re-Authentication  ไหม ? อย่างโอนเงิน มันมี OTP ครอบดักอีกที

Implementation Technique

  • Multi-Factor Authentication
  • Token Based - ใช้กับพวก Micro Service กันเยอะ
  • Secure Password Storage - วิธีการที่ดีที่สุดในตอนนี้ พวก Hash เข้าแล้วถอดไม่ได้ และไม่จำเป็นอย่างเขียน Algorithm ด้านนี้เอง ถ้าทำเองแล้วคงต้องมีพวก Paper รายงานการทดสอบอีกเยอะ
  • Process

ทำแล้วได้อะไร -Comply with

  • OWASP Top 10 2013: A2(Broken Authentication and Session Management)
  • OWASP Mobile Top 10 2016: M4 (Insecure Authentication)
5. Access Controls
  • ในส่วนนี้ คือ การบอกว่า ผ่านจาก Authentication  มาแล้ว เราให้สิทธิอะไร ทำอะไรได้บ้าง ? โดยต้องทำจากฝั่ง Server นะ
  • มันคล้ายกับ Security Concept ในส่วนของ Design ครับ อาทิ เช่น
    - Deny by Default - มองว่าทุกที่เข้ามาไม่มีสิทธิ
    - และ ให้สิทธิที่จำเป็น (Least Privilege)
    - ทุกอย่างขั้นตอน(Request) ต้องผ่านกระบวนการตรวจสอบ ไม่มีการทำ By Pass
    - ไม่มี God Mode - Hard Code Access Control เช่น ถ้า user id -3 ทำอะไรกับระบบได้ทั้งหมดเลย
  • บาง Framework มีทำให้แล้วนะ อย่างตัว Spring เองมี Spring Security

ทำแล้วได้อะไร -Comply with

  • OWASP Top 10 2013: A4(Insecure Direct Object References) / A7(Missing Function Level Access Control)
  • OWASP Mobile Top 10 2016: M6 (Insecure Authorization)
6. More Coding Security Practices
  • Cryptography
  • Logging and Intrusion Detection
  • Leverage Security Frameworks and Libraries
  • Error and Exception Handling
  • Data Validation
  • Tokenization

เนื่องจากเวลาจำกัด แล้วเนื้อหาช่วงหลังไปเร็วมากครับ หากผมเขียนอะไรแล้วงง สามารถไปดู Slide ของ Speaker ประกอบได้ครับ
Slide: Coding Security

Note 2017-06-19 ขอเพิ่ม Comment จากพี่นฤดม เผื่อใครมา Search Google นะครับ


Discover more from naiwaen@DebuggingSoft

Subscribe to get the latest posts sent to your email.