نکات زیر، جالبترین نکات در خصوص شیوه حمله بوده که قابل توجه است:
- یک کاربر از یک وب سایت حاوی کدهای مخرب و آلوده که یک فایل را میزبانی میکند، مانند evil.html بازدید میکند.
- با توجه به یک بخش از آسیب پذیری، فایل evil.html دانلود میشود و کارت SD آن را بدون هشدار به کاربر، ذخیره میکند!
- با توجه به بخش دیگری از آسیب پذیری، به محض اینکه فایل ذخیره شد، میتوان کدهای جاوا اسکریپت مخرب را روی آن اجرا کرد!
- بدلیل بخش پایانی حمله روی این آسیب پذیری، کدهای جاوااسکریپت تحت شرایطی خاص روی سیستم محلی (local) اجرا میشوند! ابزار آلوده و برنامه نویسی شده، براحتی روی کارت SD ذخیره و مستقر شده و به وب سایت مهاجم برای ارسال اطلاعات قربانی دسترسی کامل دارد.
ممکن است بپرسید، "من فقط یک توسعه دهنده اندرویدی کوچکی هستم که قصد دارم برنامه خودم را در یک مارکت اندرویدی بفروشم و قیمت این برنامه خیلی پایین است. بنابراین آیا واقعا باید زمانی را برای انجام این کار امنیتی از قبل هدر دهم؟
و من با صدای رسا جواب میدهم : "بله! باید این کار را انجام دهید." این کار باعث میشود تا در حین گسترش اپلیکیشن کوچک خود، دیگر نگران مشکلات حملات مستقیم یا غیرمستقیم نباشید.
حملات مستقیم (Direct Attacks)
حملات مستقیم به طور قابلتوجهی متفاوت هستند و میتوانند شکلهای گوناگونی برای حمله داشته باشند. یک حمله مستقیم میتواند به عنوان فردی که مستقیما در برنامه شما هدف قرار داده میشود، طبقهبندی شود. بنابراین، مهاجم به دنبال آسیب پذیری برای نفوذ در طراحی برنامه شما برای جمعآوری اطلاعات حساس در مورد شما و کاربرانتان است. استفاده از کاربران برنامه و یا حمله به کارگزار، از مواردی است که یک مهاجم در اولویت کار خود قرار میدهد! یک مهاجم ممکن است به دنبال برنامههای کاربردی تلفن همراه باشد که متعلق به یک نهاد دولتی است مثل، یک بانک خاص که شما اپلیکیشن آنرا روی تلفن خود نصب کردهاید و آپدیتهای امنیتی راهم انجام ندادهاید! اگر طرح امنیتی روی برنامه ضعیف باشد و دادههای حساس و حیاتی کاربران در محلی امن نگه داری نشود یا حتی ارتباط بین برنامه و ssl و سرور بدرستی برقرار نباشد، مهاجم میتواند حملات خاصی را روی ssl انجام دهد و نقاط ضعف را شناسایی کرده و در کسری از زمان به سرور متصل شود! این حمله یک حمله مستقیم و بدون دخالت فایل یا ابزار خاصی است. این یک حمله مستقیم به یک برنامه خاص است.
Proxim و ذخیره داده
بیایید با یک مثال ساده با نام Proxim شروع کنیم: برای نوشتن یک برنامه که میتواند یک SMS را به افراد خاص و معین ارسال کند، قرار دادی بستهایم؛ با توجه به نزدیکی به مجموعهای از مختصات مکانی آنها روی GPS. برای مثال: کاربر در این برنامه میتواند شماره تماس همسر خود را ذخیره کرده و هر زمان که به فاصله 3 مایلی به خانه یا محل کار برسد، با او تماس میگیرد. بدین صورت همسر فرد مطلع میشود که او نزدیک به محل کار یا خانه است و با یک تماس تلفنی او را آگاه میسازد.
کدهای زیر بخشی از فایل (Save Routine, SaveController. java) هستند:
package net.zenconsult.android.controller; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import net.zenconsult.android.model.Contact; import net.zenconsult.android.model.Location; import android.content.Context; import android.os.Environment; import android.util.Log; public class SaveController { private static final String TAG = "SaveController"; public static void saveContact(Context context, Contact contact) { if (isReadWrite()) { try { File outputFile = new File(context.getExternalFilesDir(null), contact.getFirstName()); FileOutputStream outputStream = new FileOutputStream(outputFile); outputStream.write(contact.getBytes()); outputStream.close(); } catch (FileNotFoundException e) { Log.e(TAG, "File not found"); } catch (IOException e) { Log.e(TAG, "IO Exception"); } } else { Log.e(TAG, "Error opening media card in read/write mode!"); } } public static void saveLocation(Context context, Location location) { if (isReadWrite()) { try { File outputFile = new File(context.getExternalFilesDir(null), location.getIdentifier()); FileOutputStream outputStream = new FileOutputStream(outputFile); outputStream.write(location.getBytes()); outputStream.close(); } catch (FileNotFoundException e) { Log.e(TAG, "File not found"); } catch (IOException e) { Log.e(TAG, "IO Exception"); } } else { Log.e(TAG, "Error opening media card in read/write mode!"); } } private static boolean isReadOnly() { Log.e(TAG, Environment .getExternalStorageState()); return Environment.MEDIA_MOUNTED_READ_ONLY.equals(Environment .getExternalStorageState()); } private static boolean isReadWrite() { Log.e(TAG, Environment .getExternalStorageState()); return Environment.MEDIA_MOUNTED.equals(Environment .getExternalStorageState()); } }
کدهای فایل ( Location .java)
package net.zenconsult.android.model; publicclass Location { private String identifier; privatedouble latitude; privatedouble longitude; public Location() {} publicdouble getLatitude() { return latitude; } publicvoid setLatitude(double latitude) { this.latitude = latitude; } publicdouble getLongitude() { return longitude; } publicvoid setLongitude(double longitude) { this.longitude = longitude; } publicvoid setIdentifier(String identifier) { this.identifier = identifier; } public String getIdentifier() { return identifier; } public String toString() { StringBuilder ret = new StringBuilder(); ret.append(getIdentifier()); ret.append(String.valueOf(getLatitude())); ret.append(String.valueOf(getLongitude())); return ret.toString(); } publicbyte[] getBytes() { return toString().getBytes(); } }
کدهای فایل (Contact.java)
package net.zenconsult.android.model; publicclass Contact { private String firstName; private String lastName; private String address1; private String address2; private String email; private String phone; public Contact() {} public String getFirstName() { return firstName; } publicvoid setFirstName(String firstName) { this.firstName = firstName; } public String getLastName() { return lastName; } publicvoid setLastName(String lastName) { this.lastName = lastName; } public String getAddress1() { return address1; } publicvoid setAddress1(String address1) { this.address1 = address1; } public String getAddress2() { return address2; } publicvoid setAddress2(String address2) { this.address2 = address2; } public String getEmail() { return email; } publicvoid setEmail(String email) { this.email = email; } public String getPhone() { return phone; } publicvoid setPhone(String phone) { this.phone = phone; } public String toString() { StringBuilder ret = new StringBuilder(); ret.append(getFirstName() + "|"); ret.append(getLastName() + "|"); ret.append(getAddress1() + "|"); ret.append(getAddress2() + "|"); ret.append(getEmail() + "|"); ret.append(getPhone() + "|"); return ret.toString(); } publicbyte[] getBytes() { return toString().getBytes(); } }
final Contact contact = new Contact(); contact.setFirstName("User 1"); contact.setLastName("L1"); contact.setAddress1(""); contact.setAddress2(""); contact.setEmail("name@site.net"); contact.setPhone("12120031337");