OWASP বিভাগ: MASVS-CODE: কোড গুণমান
ওভারভিউ
একটি অনিরাপদ URI লোডিং ঘটে যখন একটি Android অ্যাপ্লিকেশন একটি WebView এ লোড করার আগে URI এর বৈধতা সঠিকভাবে মূল্যায়ন করতে ব্যর্থ হয়৷
এই ধরনের দুর্বলতার পিছনে অন্তর্নিহিত কারণ হল যে একটি URI একাধিক অংশ নিয়ে গঠিত , যার মধ্যে ন্যূনতম, স্কিম এবং হোস্ট (কর্তৃপক্ষের অংশের) অবশ্যই যাচাই করা উচিত (যেমন অনুমোদিত তালিকাভুক্ত) URI একটি WebView এ লোড হওয়ার আগে অথবা অ্যাপ্লিকেশন দ্বারা অভ্যন্তরীণভাবে ব্যবহৃত হয়।
সবচেয়ে সাধারণ ভুল অন্তর্ভুক্ত:
- হোস্ট চেক করা হচ্ছে কিন্তু স্কিম নয়, একজন আক্রমণকারীকে প্রমাণীকৃত হোস্টের সাথে
http://
,content://
বাjavascript://
এর মতো স্কিম ব্যবহার করার অনুমতি দেয়৷ - URI সঠিকভাবে পার্স করতে ব্যর্থ হচ্ছে, বিশেষ করে এমন ক্ষেত্রে যেখানে URI একটি স্ট্রিং হিসাবে গৃহীত হয়।
- স্কিমটি যাচাই করা হচ্ছে কিন্তু হোস্ট নয় (অপ্রতুল হোস্টের বৈধতা)।
শেষের ক্ষেত্রে, এটি সাধারণত ঘটে যখন অ্যাপ্লিকেশনটিকে একটি প্রাথমিক ডোমেনের স্বেচ্ছাচারী সাবডোমেনগুলিকে অনুমতি দিতে হয়। সুতরাং, হোস্টনামটি সঠিকভাবে বের করা হলেও, অ্যাপটি এক্সট্রাক্ট করা স্ট্রিং বিভাগে একটি প্রাথমিক ডোমেনের উপস্থিতি যাচাই করতে startsWith
, endsWith,
বা java.lang.String
contains
মত পদ্ধতি ব্যবহার করে। ভুলভাবে ব্যবহার করা হলে, এই পদ্ধতিগুলি ত্রুটিপূর্ণ ফলাফলের দিকে নিয়ে যেতে পারে এবং অ্যাপ্লিকেশনটিকে একটি সম্ভাব্য দূষিত হোস্টকে ভুলভাবে বিশ্বাস করতে বাধ্য করতে পারে৷
প্রভাব
হোস্ট ব্যবহার করা হয় এমন প্রেক্ষাপটের উপর নির্ভর করে, প্রভাব পরিবর্তিত হতে পারে। যে ক্ষেত্রে একটি ওয়েবভিউতে একটি ক্ষতিকারক URI (অর্থাৎ, যেটি ফিল্টারিং/অনুমোদিত তালিকাকে বাইপাস করেছে) লোড করার ফলে সম্ভাব্যভাবে অ্যাকাউন্ট টেকওভার হতে পারে (যেমন ফিশিং ব্যবহার করে), কোড এক্সিকিউশন (যেমন, ক্ষতিকারক জাভাস্ক্রিপ্ট লোড করা), বা ডিভাইস আপস (কোড ব্যবহার করে বিতরণ করা শোষণ) হাইপারলিঙ্ক)।
প্রশমন
স্ট্রিং ইউআরআই পরিচালনা করার সময়, স্ট্রিংটিকে ইউআরআই হিসাবে পার্স করা এবং স্কিম এবং হোস্ট উভয়কেই যাচাই করা গুরুত্বপূর্ণ:
কোটলিন
fun isUriTrusted(incomingUri: String, trustedHostName: String): Boolean {
try {
val uri = Uri.parse(incomingUri)
return uri.scheme == "https" && uri.host == trustedHostName
} catch (e: NullPointerException) {
throw NullPointerException("incomingUri is null or not well-formed")
}
}
জাভা
public static boolean isUriTrusted(String incomingUri, String trustedHostName)
throws NullPointerException {
try {
Uri uri = Uri.parse(incomingUri);
return uri.getScheme().equals("https") &&
uri.getHost().equals(trustedHostName);
} catch (NullPointerException e) {
throw new NullPointerException(
"incomingUri is null or not well-formed");
}
}
হোস্টের বৈধতার জন্য, সংশ্লিষ্ট URI অংশকে বিচ্ছিন্ন করার পরে, হোস্টটি বিশ্বস্ত কি না তা সঠিকভাবে সনাক্ত করার জন্য এটি সম্পূর্ণরূপে (আংশিকভাবে নয়) যাচাই করা গুরুত্বপূর্ণ। startsWith
বা endsWith
মত পদ্ধতি ব্যবহার করার সময় এড়ানো যাবে না, সঠিক সিনট্যাক্স ব্যবহার করা এবং প্রয়োজনীয় অক্ষর বা চিহ্নগুলিকে উপেক্ষা করা গুরুত্বপূর্ণ (উদাহরণস্বরূপ, সঠিক মিলের জন্য endsWith
ডোমেন নামের আগে " .
" ডট অক্ষর প্রয়োজন)। এই অক্ষরগুলিকে অবহেলা করলে ভুল মিল এবং আপোস নিরাপত্তার কারণ হতে পারে। যেহেতু সাবডোমেনগুলি অসীমভাবে নেস্ট করা যেতে পারে, তাই হোস্টনাম যাচাই করার জন্য রেগুলার এক্সপ্রেশন ম্যাচিং একটি প্রস্তাবিত কৌশল নয়।
অবদানকারী: মাইক্রোসফট থ্রেট ইন্টেলিজেন্সের দিমিত্রিওস ভালসামারাস এবং মাইকেল পেক