Skip to content
ეს გვერდი შეიქმნა და ითარგმნა ხელოვნური ინტელექტის დახმარებით. თუ შეამჩნევთ უზუსტობას, გთხოვთ, დაგვეხმარეთ გაუმჯობესებაში. GitHub-ზე რედაქტირება

Shell-ის შესრულება

shell ინსტრუმენტი PRX-ის სამი ძირითადი ინსტრუმენტიდან ერთ-ერთია, ხელმისაწვდომი default_tools() და all_tools() რეესტრებში. იგი ოპერაციული სისტემის დონეზე ბრძანებების შესრულებას უზრუნველყოფს კონფიგურირებად სენდბოქსში, რაც უზრუნველყოფს აგენტის მიერ ინიცირებული ბრძანებების მკაცრი იზოლაციის, დროის ლიმიტებისა და გამოსავალის შეზღუდვების პირობებში შესრულებას.

როცა LLM განსაზღვრავს, რომ shell ბრძანების გაშვებაა საჭირო -- პაკეტის დაყენება, კოდის კომპილაცია, სისტემის მდგომარეობის მოთხოვნა ან სკრიპტის გაშვება -- იგი shell ინსტრუმენტს ბრძანების სტრიქონით გამოიძახებს. PRX შესრულებას კონფიგურირებულ სენდბოქსის ბექენდში გადაფუთავს, 60-წამიან ნაგულისხმევ დროის ამოწურვას აღასრულებს, გამოსავალს 1 MB-ით ზღუდავს და მგრძნობიარე გარემოს ცვლადებს ამოშლის შვილობილი პროცესის გაშვებამდე.

shell ინსტრუმენტი, როგორც წესი, PRX-ის ინსტრუმენტებს შორის ყველაზე ძლიერი და ყველაზე შეზღუდულია. იგი უსაფრთხოების პოლიტიკის ძრავის პირველი სამიზნეა, და უმეტესი განლაგება მას supervised-ად ნიშნავს, რაც ყოველი შესრულებისას ადამიანის თანხმობას მოითხოვს.

კონფიგურაცია

shell ინსტრუმენტს თავისი კონფიგურაციის სექცია არ აქვს. მისი ქცევა უსაფრთხოების სენდბოქსით და რესურსების ლიმიტებით კონტროლდება:

toml
[security.sandbox]
enabled = true
backend = "auto"         # "auto" | "landlock" | "firejail" | "bubblewrap" | "docker" | "none"

# მორგებული Firejail არგუმენტები (როცა backend = "firejail")
firejail_args = ["--net=none", "--noroot"]

[security.sandbox.docker]
image = "prx-sandbox:latest"
network = "none"
memory_limit = "256m"
cpu_limit = "1.0"

[security.sandbox.bubblewrap]
allow_network = false
writable_paths = ["/tmp"]
readonly_paths = ["/usr", "/lib"]

[security.resources]
max_memory_mb = 512
max_cpu_time_seconds = 60
max_subprocesses = 10
memory_monitoring = true

shell-ის ზედამხედველობით მონიშვნისთვის (ყოველ გამოძახებაზე თანხმობის მოთხოვნა):

toml
[security.tool_policy.tools]
shell = "supervised"

სენდბოქსის ბექენდები

PRX ხუთ სენდბოქსის ბექენდს უჭერს მხარს. როცა backend = "auto", PRX ხელმისაწვდომ ბექენდებს შემდეგი პრიორიტეტით ამოწმებს და პირველ ნაპოვნს ირჩევს:

ბექენდიპლატფორმაიზოლაციის დონეზედნადებიშენიშვნები
LandlockLinux (5.13+)ფაილური სისტემის LSMმინიმალურიბირთვის მშობლიური, დამატებითი დამოკიდებულებები არ სჭირდება. ფაილური სისტემის ბილიკებს ბირთვის დონეზე ზღუდავს.
FirejailLinuxსრული (ქსელი, ფაილური სისტემა, PID)დაბალიმომხმარებლის სივრცის სენდბოქსი. უჭერს მხარს --net=none ქსელის იზოლაციისთვის, PID სახელთა სივრცეს, seccomp ფილტრაციას.
BubblewrapLinux, macOSსახელთა სივრცეზე დაფუძნებულიდაბალიმომხმარებლის სახელთა სივრცეებს იყენებს. კონფიგურირებადი ჩაწერადი/მხოლოდ-წაკითხვადი ბილიკების სიები.
Dockerნებისმიერისრული კონტეინერიმაღალიბრძანებებს ერთჯერად კონტეინერში ასრულებს. მაქსიმალური იზოლაცია, მაგრამ ყველაზე მაღალი დაყოვნება.
Noneნებისმიერიმხოლოდ აპლიკაციის დონეარცერთიოპერაციული სისტემის დონეზე იზოლაცია არ არის. PRX მაინც აღასრულებს დროის ამოწურვას და გამოსავალის ლიმიტებს, მაგრამ პროცესს სრული ოპერაციული სისტემის წვდომა აქვს.

Landlock

Landlock არის Linux-ის უსაფრთხოების მოდული, ხელმისაწვდომი ბირთვის ვერსია 5.13-დან. იგი ფაილური სისტემის წვდომას ბირთვის დონეზე ზღუდავს root პრივილეგიების გარეშე.

Firejail

Firejail ყოვლისმომცველ სენდბოქსირებას უზრუნველყოფს Linux-ის სახელთა სივრცეებითა და seccomp-ით. მორგებული არგუმენტების გადაცემა firejail_args-ით შეიძლება:

toml
[security.sandbox]
backend = "firejail"
firejail_args = ["--net=none", "--noroot", "--nosound", "--no3d"]

Bubblewrap

Bubblewrap (bwrap) მომხმარებლის სახელთა სივრცეებს იყენებს მინიმალური სენდბოქსირებული გარემოს შესაქმნელად. Firejail-ზე მსუბუქია და macOS-ის ზოგიერთ კონფიგურაციაზე მუშაობს:

toml
[security.sandbox.bubblewrap]
allow_network = false
writable_paths = ["/tmp", "/home/user/workspace"]
readonly_paths = ["/usr", "/lib", "/bin"]

Docker

Docker სრულ კონტეინერის იზოლაციას უზრუნველყოფს. ყოველი ბრძანება ახალ კონტეინერში ეშვება კონფიგურირებული სურათის საფუძველზე:

toml
[security.sandbox.docker]
image = "prx-sandbox:latest"
network = "none"
memory_limit = "256m"
cpu_limit = "1.0"

გამოყენება

shell ინსტრუმენტს LLM იძახებს აგენტური ციკლების დროს. აგენტის საუბრებში LLM ინსტრუმენტის გამოძახებას წარმოქმნის:

json
{
  "name": "shell",
  "arguments": {
    "command": "ls -la /home/user/project"
  }
}

CLI-დან shell ინსტრუმენტის გამოძახებების დაკვირვება აგენტის გამოსავალში შეიძლება.

შესრულების ნაკადი

  1. LLM წარმოქმნის shell ინსტრუმენტის გამოძახებას command არგუმენტით
  2. უსაფრთხოების პოლიტიკის ძრავი ამოწმებს, ნებადართულია, უარყოფილია თუ ზედამხედველობას მოითხოვს გამოძახება
  3. ზედამხედველობის შემთხვევაში, PRX მომხმარებელს თანხმობას ეკითხება გაგრძელებამდე
  4. სენდბოქსის ბექენდი ბრძანებას შესაბამის იზოლაციის ფენაში გადაფუთავს
  5. გარემოს ცვლადები სანიტარიზდება (იხ. ქვემოთ)
  6. ბრძანება სრულდება 60-წამიანი დროის ამოწურვით
  7. stdout და stderr აღირიცხება, საჭიროებისას 1 MB-მდე მოიჭრება
  8. შედეგი LLM-ს უბრუნდება როგორც ToolResult წარმატების/წარუმატებლობის სტატუსით

პარამეტრები

პარამეტრიტიპისავალდებულონაგულისხმევიაღწერა
commandstringდიახ--შესასრულებელი shell ბრძანება. /bin/sh -c-ს (ან ეკვივალენტს) გადაეცემა.

ინსტრუმენტი აბრუნებს ToolResult-ს, რომელიც შეიცავს:

ველიტიპიაღწერა
successbooltrue თუ ბრძანება 0 კოდით დასრულდა
outputstringგაერთიანებული stdout და stderr, 1 MB-მდე მოჭრილი
errorstring?შეცდომის შეტყობინება ბრძანების წარუმატებლობის ან დროის ამოწურვის შემთხვევაში

გარემოს სანიტარიზაცია

shell ინსტრუმენტი მხოლოდ მკაცრ თეთრ სიაში მყოფ გარემოს ცვლადებს გადასცემს შვილობილ პროცესებს. ეს API გასაღებების, ტოკენებისა და საიდუმლოებების შემთხვევით გაჟონვას თავიდან იცილებს.

ნებადართული გარემოს ცვლადები:

ცვლადიდანიშნულება
PATHშესასრულებელი ფაილების ძიების ბილიკი
HOMEმომხმარებლის მთავარი დირექტორია
TERMტერმინალის ტიპი
LANGლოკალის ენა
LC_ALLლოკალის გადაფარვა
LC_CTYPEსიმბოლოს ტიპის ლოკალი
USERმიმდინარე მომხმარებლის სახელი
SHELLნაგულისხმევი shell-ის ბილიკი
TMPDIRდროებითი დირექტორია

ყველა სხვა ცვლადი -- API_KEY, AWS_SECRET_ACCESS_KEY, GITHUB_TOKEN, OPENAI_API_KEY და ნებისმიერი მორგებული ცვლადი -- შვილობილი პროცესის გარემოდან ამოშლილია. ეს მკაცრად კოდირებული უსაფრთხოების საზღვარია, რომელიც კონფიგურაციით ვერ გადაიფარება.

რესურსების ლიმიტები

ლიმიტინაგულისხმევიკონფიგურირებადიაღწერა
დროის ამოწურვა60 წამიsecurity.resources.max_cpu_time_secondsმაქსიმალური საათის დრო ბრძანებაზე
გამოსავალის ზომა1 MB--მაქსიმალური გაერთიანებული stdout + stderr
მეხსიერება512 MBsecurity.resources.max_memory_mbმაქსიმალური მეხსიერების გამოყენება ბრძანებაზე
ქვეპროცესები10security.resources.max_subprocessesმაქსიმალური გაშვებული შვილობილი პროცესები

როცა ბრძანება დროის ამოწურვას გადააჭარბებს, PRX SIGTERM-ს აგზავნის, შემდეგ მოლოდინის პერიოდის შემდეგ SIGKILL-ს. ინსტრუმენტის შედეგი დროის ამოწურვას შეცდომად აღნიშნავს.

უსაფრთხოება

  • სენდბოქსის იზოლაცია: ბრძანებები კონფიგურირებულ სენდბოქსის ბექენდში სრულდება, რაც ფაილური სისტემის, ქსელისა და პროცესის წვდომას ზღუდავს
  • გარემოს სანიტარიზაცია: მხოლოდ 9 თეთრ სიაში მყოფი გარემოს ცვლადი გადაეცემა შვილობილ პროცესებს
  • პოლიტიკის ძრავი: ყოველი shell გამოძახება უსაფრთხოების პოლიტიკის ძრავაში გადის შესრულებამდე
  • აუდიტის ჟურნალირება: ყველა shell ბრძანება და მათი შედეგები აუდიტის ჟურნალში იწერება, როცა security.audit.enabled = true
  • ზედამხედველობის რეჟიმი: shell ინსტრუმენტი შეიძლება supervised-ად მოინიშნოს ინსტრუმენტების პოლიტიკაში, რაც ყოველ შესრულებაზე მომხმარებლის ექსპლიციტურ თანხმობას მოითხოვს
  • რესურსების ლიმიტები: მკაცრი ლიმიტები დროის ამოწურვაზე, მეხსიერებაზე, გამოსავალის ზომასა და ქვეპროცესების რაოდენობაზე რესურსების ამოწურვას თავიდან იცილებს

საფრთხეების შერბილება

shell ინსტრუმენტი პრომპტ ინჯექციის შეტევების მთავარი ვექტორია. PRX ამას შერბილებს:

  1. სენდბოქსის შეზღუდვით -- მავნე ბრძანების შესრულების შემთხვევაშიც კი, იგი შეზღუდული ფაილური სისტემისა და ქსელის წვდომით ეშვება
  2. გარემოს ამოშლით -- API გასაღებები და საიდუმლოებები შვილობილი პროცესისთვის ხელმისაწვდომი არ არის
  3. ზედამხედველობის რეჟიმით -- ადამიანი-ციკლში-ს შეუძლია ყოველი ბრძანების გადახედვა შესრულებამდე
  4. აუდიტის ჩანაწერით -- ყველა ბრძანება იწერება სასამართლო ექსპერტიზის მიმოხილვისთვის

დაკავშირებული გვერდები

Released under the Apache-2.0 License.