অবিশ্বস্ত কোড কার্যকর করার জন্য সেরা অনুশীলন


31

আমার একটি প্রকল্প রয়েছে যেখানে আমার ব্যবহারকারীদের আমার সার্ভারের বিরুদ্ধে নির্বিচারে, অবিশ্বস্ত পাইথন কোডটি চালানোর অনুমতি দেওয়া উচিত ( এরকম কিছু )। আমি অজগর থেকে মোটামুটি নতুন এবং আমি সিস্টেমের মধ্যে সুরক্ষা গর্ত বা অন্যান্য দুর্বলতা প্রবর্তন করে এমন কোনও ভুল করা এড়াতে চাই। এখানে কোনও সেরা অনুশীলন রয়েছে কি, প্রস্তাবিত পড়া বা অন্য পয়েন্টারগুলি আপনি আমাকে আমার পরিষেবাটি ব্যবহারযোগ্য করে তুলতে পারেন তবে আপত্তিজনক নয়?

আমি এখন পর্যন্ত যা বিবেচনা করেছি তা এখানে:

  • সম্ভাব্য বিপজ্জনক প্যাকেজগুলির মতো ব্যবহার নিষিদ্ধ করতে প্রসঙ্গ __builtins__থেকে সরান । ব্যবহারকারীরা কেবলমাত্র তাদের সরবরাহ করা প্যাকেজগুলিই ব্যবহার করতে সক্ষম হবেন।execos
  • যুক্তিসঙ্গত সময়সীমা প্রয়োগ করতে থ্রেড ব্যবহার করুন।
  • আমি মেমরির মোট পরিমাণ সীমাবদ্ধ করতে চাই যা execপ্রসঙ্গের মধ্যে বরাদ্দ করা যায় , তবে আমি নিশ্চিত না এটি এমনকি সম্ভব কিনা।

একটি সোজা কিছু বিকল্প আছে exec, কিন্তু আমি নিশ্চিত না যে এর মধ্যে কোনটি এখানে সহায়ক হবে:

  • ast.NodeVisitorঅনিরাপদ অবজেক্টগুলিতে অ্যাক্সেসের যেকোন প্রয়াস ধরতে একটি ব্যবহার করে। তবে আমার কোন জিনিসগুলি নিষিদ্ধ করা উচিত?
  • ইনপুটটিতে কোনও ডাবল-আন্ডারস্কোর অনুসন্ধান করা। (উপরের বিকল্পের চেয়ে কম কৌতুকপূর্ণ)।
  • PyPyকোড ব্যবহার করে বা স্যান্ডবক্সের অনুরূপ কিছু।

দ্রষ্টব্য: আমি সচেতন যে কমপক্ষে একটি জাভাস্ক্রিপ্ট-ভিত্তিক দোভাষী আছে। এটি আমার দৃশ্যে কাজ করবে না।



3
@ মার্তিজজনপিটারস: দুর্দান্ত। আপনি প্রতিটি উত্তর সংক্ষিপ্ত বিবরণ যদি সম্ভবত একটি উত্তর, উপযুক্ত।
রবার্ট হার্ভে

এটিও বিবেচনা করুন: ডিস্কের জঞ্জাল, নেটওয়ার্ক (তাদের স্প্যাম বা যা কিছু প্রেরণ করতে দেবেন না), অন্য ফাইলগুলিতে অনুমতি (আপনার ফাইলগুলি পড়া)। এমনকি লুপ সিডি মেকানিক্সকে ধ্বংস করতে পারে এমন সময়েও বের করুন ... আমি ভার্চুয়ালাইজেশনের জন্য যাব (জেল বা কোনও কেভিএম যার নাম আপনি রেখেছেন) বা কমপক্ষে কোনও সুযোগ-সুবিধায় কমপক্ষে ব্যবহারকারী। আপনার নিজের প্রোগ্রামগুলি উপকারের জন্য যুক্তিসঙ্গত সুন্দর এবং পরিমাণের মেমরি সেট করুন।
কিটিকি


1
পাইপাই :> স্যান্ডবক্সিং চেষ্টা করুন : পাইপাই সম্পূর্ণ সুরক্ষিত উপায়ে অবিশ্বস্ত কোড চালনার ক্ষমতা সরবরাহ করে।
ভোরাক

উত্তর:


28

পাইথন স্যান্ডবক্সিং শক্ত । পাইথন সহজাতভাবে অন্তর্মুখী, একাধিক স্তরে।

এর অর্থ হ'ল আপনি সেই ধরণের নিজস্ব থেকে নির্দিষ্ট ধরণের কারখানার পদ্ধতিগুলি নিজেরাই সন্ধান করতে পারেন এবং নতুন নিম্ন-স্তরের অবজেক্ট তৈরি করতে পারেন, যা দোভাষী দ্বারা সরাসরি সীমাবদ্ধতা ছাড়াই পরিচালিত হবে।

পাইথন স্যান্ডবক্সগুলি ভেঙে ফেলার সৃজনশীল উপায়গুলি খুঁজে পাওয়ার কয়েকটি উদাহরণ এখানে রয়েছে:

  • নেড ব্যাচেল্ডার একটি বিক্ষোভ দিয়ে শুরু করেছিলেন যে সত্যই কতটা বিপজ্জনকeval() ; eval()পাইথন এক্সপ্রেশনগুলি প্রায়শই সম্পাদন করতে ব্যবহৃত হয়; ওয়ান-লাইনারগুলির জন্য একটি আদিম এবং নিষ্পাপ স্যান্ডবক্স হিসাবে।

    তারপরে তিনি পাইথন 3- তে একই নীতিগুলি চেষ্টা এবং প্রয়োগ অব্যাহত রেখেছিলেন , শেষ পর্যন্ত কিছু সহায়ক পয়েন্টার দিয়ে বেরিয়ে আসতে সক্ষম হন

  • পাইরে বোর্ডন হ্যাক-এ-থন-তে পাইথন সিস্টেম হ্যাক করতে অনুরূপ কৌশল ব্যবহার করে

প্রাথমিক ধারণাটি সর্বদা বেস পাইথন প্রকার তৈরির উপায় অনুসন্ধান করা; ফাংশন এবং ক্লাস এবং পাইথন ইন্টারপ্রেটারকে স্বেচ্ছাসেবক (পরীক্ষা না করা!) বাইটকোড কার্যকর করার জন্য শেলটি ভেঙে দেয়।

একই এবং আরও execবিবৃতিতে প্রযোজ্য ( exec()পাইথন 3 এ ফাংশন)।

সুতরাং, আপনি চান:

  • পাইথন কোডের বাইট সংকলনটি কঠোরভাবে নিয়ন্ত্রণ করুন বা কমপক্ষে পোস্ট-প্রক্রিয়া করে আন্ডারস্কোর দিয়ে শুরু হওয়া নামের কোনও অ্যাক্সেস সরিয়ে নিতে বাইটকোড পোস্ট করুন।

    পাইথন ইন্টারপ্রেটার কীভাবে কাজ করে এবং পাইথন বাইটকোড কীভাবে কাঠামোগত হয় তার অন্তরঙ্গ জ্ঞান প্রয়োজন। কোড অবজেক্টগুলি নেস্টেড; মডিউলটির বাইটকোড কেবলমাত্র বিবৃতিগুলির শীর্ষ স্তরকে কভার করে, প্রতিটি ফাংশন এবং শ্রেণিতে তাদের নিজস্ব বাইকোড সিকোয়েন্স প্লাস মেটাডেটা থাকে, উদাহরণস্বরূপ নেস্টেড ফাংশন এবং ক্লাসের জন্য অন্যান্য বাইটকোড অবজেক্ট থাকে।

  • আপনার ব্যবহার করা যেতে পারে এমন মডিউলগুলি হোয়াইটলিস্ট করতে হবে। সাবধানে।

    পাইথন মডিউলটিতে অন্যান্য মডিউলগুলির উল্লেখ রয়েছে । আপনি যদি আমদানি করেন তবে আপনার মডিউল নেমস্পেসে osএকটি স্থানীয় নাম osরয়েছে যা osমডিউলটিকে বোঝায় । এটি একটি নির্ধারিত আক্রমণকারীকে মডিউলগুলিতে নিয়ে যেতে পারে যা তাদের স্যান্ডবক্স থেকে বেরিয়ে আসতে সহায়তা করতে পারে। pickleমডিউল, উদাহরণস্বরূপ, আপনি উদাহরণস্বরূপ নির্বিচারে কোড বস্তু লোড, তাই যদি করতে দেয় কোন থেকে পরিচ্ছন্ন তালিকাতে যুক্ত মডিউল বিশালাকার মাধ্যমে পাথ pickleমডিউল, আপনি কি এখনও একটি সমস্যা আছে।

  • আপনার সময় কোটা কঠোরভাবে সীমাবদ্ধ করতে হবে। এমনকি সর্বাধিক নিবিড়িত কোড এখনও আপনার সংস্থানগুলি বেঁধে চিরকালের জন্য চালানোর চেষ্টা করতে পারে।

সীমাবদ্ধ পাইথনটি একবার দেখুন , যা আপনাকে কড়া বাইটকোড নিয়ন্ত্রণ দেওয়ার চেষ্টা করে। RestrictedPythonপাইথন কোডটিকে এমন কিছুতে রূপান্তরিত করে যা আপনাকে পাইথন ২.৩-এ কী কী নাম, মডিউল এবং অবজেক্টগুলিকে অনুমতি দেয় তা নিয়ন্ত্রণ করতে দেয় 7.7 এর মাধ্যমে।

যদি RestrictedPythonআপনার উদ্দেশ্যগুলির জন্য যথেষ্ট সুরক্ষিত থাকে তবে আপনি যে নীতিগুলি প্রয়োগ করেন তার উপর নির্ভর করে। একটি আন্ডারস্কোর দিয়ে শুরু হওয়া নামগুলিতে অ্যাক্সেস না দেওয়া এবং মডিউলগুলিকে কঠোরভাবে সাদা তালিকাভুক্ত করা একটি শুরু হবে।

আমার মতে, একমাত্র সত্যিকারের শক্তিশালী বিকল্প হ'ল পৃথক ভার্চুয়াল মেশিন ব্যবহার করা, বাইরের বিশ্বে কোনও নেটওয়ার্ক অ্যাক্সেস না থাকা এমন একটি যা আপনি প্রতিটি রান করার পরে ধ্বংস করেন। প্রতিটি নতুন স্ক্রিপ্ট পরিবর্তে একটি নতুন ভিএম দেওয়া হয়। এই পদ্ধতিটি এমনকি যদি কোডটি আপনার পাইথন স্যান্ডবক্সটি ভেঙে ফেলতে পরিচালিত করে (যা সম্ভাবনা নয়) সমস্ত আক্রমণকারী অল্পকালীন এবং মূল্যহীন।


10

টিএল; ডিআর একটি ক্রুট / জেল ব্যবহার করুন এবং কোনও সুযোগ-সুবিধা ছাড়াই কাস্টম ব্যবহারকারী হিসাবে চালান।

অবিশ্বস্ত কোড কার্যকর করার জন্য সর্বোত্তম অনুশীলন হ'ল এটি একটি সিস্টেম স্যান্ডবক্সের মাধ্যমে পৃথক করা । সর্বাধিক সুরক্ষার জন্য:

  • কেবল পাইথন এবং এটি নির্ভরতা এবং ধারকটির নির্ভরতা সহ একটি ধারক তৈরি করুন
  • সমস্ত ডিভাইস ছাড়াই একটি ধারক তৈরি করুন যা একেবারে প্রয়োজনীয় নয় (যেমন নেটওয়ার্ক এবং স্টোরেজ)
  • মেমরি এবং প্রক্রিয়া ব্যবহারের উপর বিধিনিষেধ সহ একটি ধারক তৈরি করুন
  • প্রতিটি রান দিয়ে কন্টেইনারটি পুনরায় তৈরি করুন (বা খুব কমপক্ষে প্রতিটি অনন্য ব্যবহারকারী এবং সর্বাধিক সময়কালের সাথে)
  • প্রয়োজনীয় ন্যূনতম সুবিধাসহ ব্যবহারকারী হিসাবে চালান
  • এমন কোনও ব্যবহারকারী হিসাবে চালান যার কাছে ফাইল লেখার অনুমতি নেই

আপনি ক্রুটে নিরাপদে জিনিস চালানোর জন্য মানক অনুশীলনগুলিও অনুসরণ করেন। প্রতিটি কলের সাথে আপনি ক্রুটের ফাইল সিস্টেমটি পুনর্নির্মাণ করতে পারেন বিশেষত অসতর্ক is সাধারণত আপনি ব্যবহারকারীকে ফাইল সিস্টেমে ক্রুট চালিত পরিবর্তনগুলি করতে অক্ষম করে তোলেন।


এটি একমাত্র জিনিস যেখানে আপনি দূর থেকেও নিশ্চিত হয়ে যাবেন যে আপনি এটি সঠিকভাবে পেয়েছেন - এটি নিজস্ব প্রক্রিয়া দিন give
মাইকেল কোহেন

3

আপনি নিরাপদে এটি করার কোনও উপায় নেই।

আপনি যদি নিরাপদে এরকম কিছু করতে চান তবে আপনার নিজের অজগরটি প্রয়োগ করতে হবে যা সম্পূর্ণ নিয়ন্ত্রিত পরিবেশে সঞ্চালিত হয়, আপনার সিস্টেমে পরিবর্তে ব্যবহারকারীদের ব্রাউজারে চালিত হয়। আপনি জ্যাথন (জাভা জন্য অজগর) দিয়ে শুরু করতে পারেন এবং এটি জাভা অ্যাপলেট হিসাবে প্যাকেজ করতে পারেন। যেহেতু এটি জাভা স্যান্ডবক্সে চলবে, ব্যবহারকারীর মেশিনে, আপনার সিস্টেমটি যুক্তিসঙ্গতভাবে নিরাপদ হবে।


4
সুরক্ষার প্রশ্নটি তার সার্ভারের জন্য ছিল, ক্লায়েন্টের মেশিনের জন্য নয়। জাভা এর সম্ভাব্য সুরক্ষা বিপত্তি, অন্য কোনও ওয়েব প্রযুক্তির মতো, হ'ল সার্ভারটি ক্লায়েন্টের জন্য ক্ষতিকারক প্রোগ্রামগুলি স্থাপন করতে ব্যবহৃত হতে পারে।
ডিডিয়ার

1
@ গ্রাসগেন্ডারমে প্লেন দুর্ঘটনার বিষয়ে অনেক নতুন স্টোরির মতো আসলে এগুলি কতটা বিরল তা আপনাকে অনেক কিছু বলে দেয়; জাভা সুরক্ষা ছিদ্র সম্পর্কে গল্পগুলি আপনাকে জানায় যে জাভা তুলনামূলকভাবে সুরক্ষিত। আপনি সি সম্পর্কে এ জাতীয় গল্পটি কখনই পাবেন না কারণ আপনি যে প্রতিক্রিয়াটি পেয়েছেন তা হ'ল ভাল "; আপনি যদি এটি চালান তবে এটি যা খুশি তা করবে"
রিচার্ড টিঙ্গল

2

মার্তিজন যেমন উপরে বলেছেন, এটি পাইথনের পক্ষে সত্যই কঠিন। কৌতুকপূর্ণভাবে পাইথন এতটা স্বজ্ঞাত, তাই ভাষা বৈশিষ্ট্য সীমাবদ্ধ করে এটি সম্ভব বলে আমি মনে করি না। এবং যদি আপনি পাইথনের একটি সংস্করণে স্যান্ডবক্স কাজ করে থাকেন তবে পরের সংস্করণটি এটি ভেঙে যাওয়ার সম্ভাবনা রয়েছে।

আমি স্ট্যান্ডার্ড সিপিথনের পরিবর্তে পাইপাইতে নজর দেব । সংক্ষেপে, এটি পাইথনের একটি সুসংগত বিকল্প বাস্তবায়ন। এর বিভিন্ন সুবিধা এবং স্বতন্ত্র বৈশিষ্ট্য রয়েছে এবং এর মধ্যে একটি হ'ল ভাষা বৈশিষ্ট্য সীমাবদ্ধ না করে সিস্টেম কলগুলি প্রতিস্থাপনের মাধ্যমে স্যান্ডবক্সিং।


0

যতক্ষণ না পারফরম্যান্স আপনার পক্ষে ব্যাপকভাবে গুরুত্বপূর্ণ না আপনি ব্রাইথনে সর্বদা এটি চালাতে পারেন যা কার্যকরভাবে জাভাস্ক্রিপ্ট স্যান্ডবক্সে রেখে দিয়েছে

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.