OWASP বিভাগ: MASVS-CODE: কোডের গুণমান
সংক্ষিপ্ত বিবরণ
অ্যাপ্লিকেশনগুলোর মধ্যে ডেটা কপি ও পেস্ট করার জন্য অ্যান্ড্রয়েড ক্লিপবোর্ড নামে একটি শক্তিশালী ফ্রেমওয়ার্ক প্রদান করে। এই ফিচারটির ভুল প্রয়োগের ফলে ব্যবহারকারীর ডেটা অননুমোদিত ক্ষতিকারক ব্যক্তি বা অ্যাপ্লিকেশনের কাছে উন্মুক্ত হয়ে যেতে পারে।
ক্লিপবোর্ডের ডেটা ফাঁস হওয়ার সাথে সম্পর্কিত নির্দিষ্ট ঝুঁকি নির্ভর করে অ্যাপ্লিকেশনটির প্রকৃতি এবং এটি যে ব্যক্তিগত শনাক্তকরণযোগ্য তথ্য (PII) পরিচালনা করছে তার উপর। আর্থিক অ্যাপ্লিকেশনগুলির ক্ষেত্রে এর প্রভাব বিশেষভাবে বেশি, কারণ এগুলি পেমেন্টের ডেটা ফাঁস করতে পারে, অথবা এমন অ্যাপের ক্ষেত্রেও ঝুঁকি থাকে যা টু-ফ্যাক্টর-অথেনটিকেশন (2FA) কোড পরিচালনা করে।
ক্লিপবোর্ডের ডেটা হাতিয়ে নেওয়ার জন্য যে আক্রমণ পদ্ধতিগুলো কাজে লাগানো যেতে পারে, তা অ্যান্ড্রয়েড সংস্করণের ওপর নির্ভর করে ভিন্ন ভিন্ন হয়:
- অ্যান্ড্রয়েড ১০ (এপিআই লেভেল ২৯)-এর চেয়ে পুরোনো সংস্করণগুলো ব্যাকগ্রাউন্ড অ্যাপ্লিকেশনগুলোকে ফোরগ্রাউন্ড অ্যাপের ক্লিপবোর্ডের তথ্য অ্যাক্সেস করার সুযোগ দেয়, যার ফলে ক্ষতিকারক ব্যক্তিরা কপি করা যেকোনো ডেটা সরাসরি অ্যাক্সেস করতে পারে।
- অ্যান্ড্রয়েড ১২ (এপিআই লেভেল ৩১) থেকে, যখনই কোনো অ্যাপ্লিকেশন ক্লিপবোর্ডের ডেটা অ্যাক্সেস করে পেস্ট করে, ব্যবহারকারীকে একটি টোস্ট মেসেজ দেখানো হয়, যার ফলে আক্রমণগুলো অলক্ষিত থাকা আরও কঠিন হয়ে পড়ে। এছাড়াও, ব্যক্তিগত শনাক্তকরণ তথ্য (PII) সুরক্ষিত করার জন্য, অ্যান্ড্রয়েড
ClipDescription.EXTRA_IS_SENSITIVEবাandroid.content.extra.IS_SENSITIVEনামক বিশেষ ফ্ল্যাগ সমর্থন করে। এটি ডেভেলপারদের কিবোর্ড জিইউআই-এর মধ্যে ক্লিপবোর্ডের বিষয়বস্তুর প্রিভিউকে দৃশ্যত অস্পষ্ট করার সুযোগ দেয়, যার ফলে কপি করা ডেটা স্পষ্ট টেক্সটে দৃশ্যমান হওয়া এবং ক্ষতিকারক অ্যাপ্লিকেশন দ্বারা চুরি হওয়া প্রতিরোধ করা যায়। উল্লিখিত ফ্ল্যাগগুলোর কোনো একটি প্রয়োগ না করা হলে, আক্রমণকারীরা শোল্ডার সার্ফিং-এর মাধ্যমে অথবা এমন ক্ষতিকারক অ্যাপ্লিকেশনের মাধ্যমে ক্লিপবোর্ডে কপি করা সংবেদনশীল ডেটা পাচার করতে পারে, যা ব্যাকগ্রাউন্ডে চলার সময় কোনো বৈধ ব্যবহারকারীর কার্যকলাপের স্ক্রিনশট নেয় বা ভিডিও রেকর্ড করে।
প্রভাব
ক্লিপবোর্ডের ভুল ব্যবহারের অপব্যবহারের ফলে ক্ষতিকারক ব্যক্তিরা ব্যবহারকারীর সংবেদনশীল বা আর্থিক তথ্য হাতিয়ে নিতে পারে। এটি আক্রমণকারীদের ফিশিং অভিযান বা পরিচয় চুরির মতো পরবর্তী পদক্ষেপ গ্রহণে সহায়তা করতে পারে।
প্রশমন
সংবেদনশীল ডেটা চিহ্নিত করুন
কিবোর্ড GUI-এর মধ্যে ক্লিপবোর্ডের বিষয়বস্তুর প্রিভিউকে দৃশ্যত অস্পষ্ট করার জন্য এই সমাধানটি প্রয়োগ করা হয়। ClipboardManager.setPrimaryClip() কল করার আগে, পাসওয়ার্ড বা ক্রেডিট কার্ডের তথ্যের মতো কপি করা যেতে পারে এমন যেকোনো সংবেদনশীল ডেটাকে ClipDescription.EXTRA_IS_SENSITIVE অথবা android.content.extra.IS_SENSITIVE দিয়ে ফ্ল্যাগ করা উচিত।
কোটলিন
// If your app is compiled with the API level 33 SDK or higher.
clipData.apply {
description.extras = PersistableBundle().apply {
putBoolean(ClipDescription.EXTRA_IS_SENSITIVE, true)
}
}
// If your app is compiled with API level 32 SDK or lower.
clipData.apply {
description.extras = PersistableBundle().apply {
putBoolean("android.content.extra.IS_SENSITIVE", true)
}
}
জাভা
// If your app is compiled with the API level 33 SDK or higher.
PersistableBundle extras = new PersistableBundle();
extras.putBoolean(ClipDescription.EXTRA_IS_SENSITIVE, true);
clipData.getDescription().setExtras(extras);
// If your app is compiled with API level 32 SDK or lower.
PersistableBundle extras = new PersistableBundle();
extras.putBoolean("android.content.extra.IS_SENSITIVE", true);
clipData.getDescription().setExtras(extras);
সর্বশেষ অ্যান্ড্রয়েড সংস্করণ প্রয়োগ করুন
অ্যাপটিকে অ্যান্ড্রয়েড ১০ (এপিআই ২৯) বা তার পরবর্তী সংস্করণগুলোতে চালানোর জন্য বাধ্য করলে, ব্যাকগ্রাউন্ড প্রসেসগুলো ফোরগ্রাউন্ড অ্যাপ্লিকেশনের ক্লিপবোর্ড ডেটা অ্যাক্সেস করতে পারে না।
অ্যাপটিকে শুধুমাত্র অ্যান্ড্রয়েড ১০ (এপিআই ২৯) বা তার পরবর্তী সংস্করণে চালানোর জন্য, অ্যান্ড্রয়েড স্টুডিওতে আপনার প্রোজেক্টের মধ্যে থাকা গ্রেডল বিল্ড ফাইলগুলিতে ভার্সন সেটিংসের জন্য নিম্নলিখিত মানগুলি সেট করুন।
গ্রুভি
android {
namespace 'com.example.testapp'
compileSdk [SDK_LATEST_VERSION]
defaultConfig {
applicationId "com.example.testapp"
minSdk 29
targetSdk [SDK_LATEST_VERSION]
versionCode 1
versionName "1.0"
...
}
...
}
...
কোটলিন
android {
namespace = "com.example.testapp"
compileSdk = [SDK_LATEST_VERSION]
defaultConfig {
applicationId = "com.example.testapp"
minSdk = 29
targetSdk = [SDK_LATEST_VERSION]
versionCode = 1
versionName = "1.0"
...
}
...
}
...
একটি নির্দিষ্ট সময় পর ক্লিপবোর্ডের বিষয়বস্তু মুছে ফেলুন
যদি অ্যাপ্লিকেশনটি অ্যান্ড্রয়েড ১০ (এপিআই লেভেল ২৯)-এর চেয়ে নিম্নতর অ্যান্ড্রয়েড সংস্করণগুলিতে চালানোর জন্য তৈরি করা হয়, তবে যেকোনো ব্যাকগ্রাউন্ড অ্যাপ্লিকেশন ক্লিপবোর্ডের ডেটা অ্যাক্সেস করতে পারে। এই ঝুঁকি কমাতে, একটি নির্দিষ্ট সময় পরে ক্লিপবোর্ডে কপি করা যেকোনো ডেটা মুছে ফেলার জন্য একটি ফাংশন প্রয়োগ করা উপকারী। অ্যান্ড্রয়েড ১৩ (এপিআই লেভেল ৩৩) থেকে এই ফাংশনটি স্বয়ংক্রিয়ভাবে সম্পাদিত হয়। পুরোনো অ্যান্ড্রয়েড সংস্করণগুলির জন্য, অ্যাপ্লিকেশনটির কোডের মধ্যে নিম্নলিখিত কোড স্নিপেটটি অন্তর্ভুক্ত করে এই ডেটা মুছে ফেলার কাজটি করা যেতে পারে।
কোটলিন
//The Executor makes this task Asynchronous so that the UI continues being responsive
backgroundExecutor.schedule({
//Creates a clip object with the content of the Clipboard
val clipboard = getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
val clip = clipboard.primaryClip
//If SDK version is higher or equal to 28, it deletes Clipboard data with clearPrimaryClip()
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
clipboard.clearPrimaryClip()
} else if (Build.VERSION.SDK_INT < Build.VERSION_CODES.P) {
//If SDK version is lower than 28, it will replace Clipboard content with an empty value
val newEmptyClip = ClipData.newPlainText("EmptyClipContent", "")
clipboard.setPrimaryClip(newEmptyClip)
}
//The delay after which the Clipboard is cleared, measured in seconds
}, 5, TimeUnit.SECONDS)
জাভা
//The Executor makes this task Asynchronous so that the UI continues being responsive
ScheduledExecutorService backgroundExecutor = Executors.newSingleThreadScheduledExecutor();
backgroundExecutor.schedule(new Runnable() {
@Override
public void run() {
//Creates a clip object with the content of the Clipboard
ClipboardManager clipboard = (ClipboardManager)getSystemService(Context.CLIPBOARD_SERVICE);
ClipData clip = clipboard.getPrimaryClip();
//If SDK version is higher or equal to 28, it deletes Clipboard data with clearPrimaryClip()
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
clipboard.clearPrimaryClip();
//If SDK version is lower than 28, it will replace Clipboard content with an empty value
} else if (Build.VERSION.SDK_INT < Build.VERSION_CODES.P) {
ClipData newEmptyClip = ClipData.newPlainText("EmptyClipContent", "");
clipboard.setPrimaryClip(newEmptyClip);
}
//The delay after which the Clipboard is cleared, measured in seconds
}, 5, TimeUnit.SECONDS);
সম্পদ
- ক্লিপবোর্ড ফ্রেমওয়ার্ক
- আপনার অ্যাপ যখন ক্লিপবোর্ডের ডেটা অ্যাক্সেস করে তখন সিস্টেম নোটিফিকেশন দেখানো হয়।
- সংবেদনশীল বিষয়বস্তু ক্লিপবোর্ডে যোগ করুন
- অ্যান্ড্রয়েড ১০-এ গোপনীয়তার পরিবর্তন
- অ্যাপ সংস্করণের তথ্য সেট করুন