OpenGraph 收集器,用于 BloodHound,可映射从 DevOps 到 MLOps 基础设施的攻击路径,收集 CI/CD 管道、服务主体和 ML 平台资源,以进行横向移动分析。
一个概念验证的OpenGraph收集器,用于BloodHound,映射从DevOps到MLOps基础设施的攻击路径。
基于Brett Hawkins(@h4wkst3r)的《从DevOps到MLOps基础设施的攻击路径:特权管道》。
Dop2Mop从DevOps和MLOps平台收集数据,以识别能够实现从CI/CD管道横向移动到机器学习训练基础设施的攻击路径。它输出兼容BloodHound的OpenGraph JSON,用于可视化和分析。
| DevOps平台 | MLOps平台 | 身份提供商 |
|---|---|---|
| GitHub(Actions、仓库、机密) | Azure机器学习 | Azure AD服务主体 |
| Azure DevOps(管道、服务连接) | Amazon SageMaker | AWS IAM角色 OIDC/联合身份 |
Dop2Mop建模了研究中识别的五个关键信任边界:
git clone https://github.com/h4wkst3r/dop2mop.git cd dop2mop pip install -r requirements.txt pip install -e .
## 收集内容
每个收集器收集平台特定的资源,并映射它们之间的信任边界:
| 收集器 | 收集的资源 |
|-----------|-------------------|
| **GitHub** | 组织、仓库、工作流、密钥、分支保护规则、OIDC配置、容器镜像引用、S3存储桶引用 |
| **Azure DevOps** | 组织、项目、流水线(YAML)、服务连接(含范围详情)、变量组、代理池、仓库 |
| **Azure ML** | 工作区、计算集群/实例、数据存储、ML环境、已注册模型、作业/实验、在线和批量端点 |
| **SageMaker** | 训练作业、模型、端点、域、笔记本实例、IAM执行角色(含策略分析)、ECR仓库/镜像、S3存储桶(仅限ML相关) |
## 快速开始
### 生成演示数据
查看Dop2Mop效果的最快方式是生成演示数据,展示研究中的攻击场景:```bash
dop2mop demo -o demo.json
// Container Image Poisoning (Supply Chain Attack) MATCH p=(workflow)-[:CanPoisonImage]->(image)<-[:PullsImage]-(job) RETURN p
// OIDC/Federated Identity Abuse (confirmed edges) MATCH p=(workflow)-[:OIDCTrust]->(oidc)-[:CanAssumeRole]->(role)-[:SubmitsJob]->(job) RETURN p
// OIDC abuse including inferred paths MATCH p=(workflow)-[:OIDCTrust]->(oidc)-[:InferredCanAssumeRole]->(role) RETURN p
// Dataset Poisoning via Pickle Deserialization MATCH p=(workflow)-[:CanPoisonDataset]->(dataset)<-[:LoadsDataset]-(job) RETURN p
// Find repos with weak/no branch protection (TB1 exploitable) MATCH (repo)-[:BypassesProtection]->(repo) RETURN repo.name, repo.default_branch
// Find overprivileged SageMaker IAM roles MATCH (role:IAMRole) WHERE role.is_admin = true OR role.has_s3_full_access = true RETURN role.name, role.attached_policies
// Find SageMaker notebooks with root + internet access MATCH (nb:SMNotebook) WHERE nb.root_access = 'Enabled' AND nb.direct_internet_access = 'Enabled' RETURN nb.name, nb.status
// Find self-hosted ADO agent pools MATCH (agent:ADOAgent) WHERE agent.is_hosted = false RETURN agent.name, agent.pool_type
---
## 配置
### 配置文件
与其每次运行时都传递凭据,不如将它们保存在配置文件中。复制附带的示例并填入你的值:```bash
cp dop2mop.yaml.example dop2mop.yaml
# Edit dop2mop.yaml with your credentials
Dop2Mop 按顺序检查以下位置:
--config 指定的路径dop2mop.yaml / dop2mop.yml / .dop2mop.yaml~/.dop2mop.yaml注意:
dop2mop.yaml已加入.gitignore,以防止意外提交凭据。示例文件 (dop2mop.yaml.example) 可安全提交。
请参阅 dop2mop.yaml.example 查看所有可用选项及注释。
优先级顺序: CLI 参数 > 配置文件 > 环境变量。
在运行完整收集之前,先测试凭据:```bash
dop2mop collect --validate -v
dop2mop collect --validate --collectors github,sagemaker -v
这会为每个平台进行轻量级 API 调用,以在开始收集前验证令牌是否有效。
### 收集器别名
你可以使用短名称代替完整的类名与 `--collectors` 参数配合使用:
| 别名 | 收集器 |
|-------|-----------|
| `github`, `gh` | GitHubCollector |
| `ado`, `azuredevops`, `azure-devops` | AzureDevOpsCollector |
| `azureml`, `azure-ml` | AzureMLCollector |
| `sagemaker`, `sm` | SageMakerCollector |```bash
# These are equivalent:
dop2mop collect --collectors GitHubCollector,SageMakerCollector
dop2mop collect --collectors github,sagemaker
dop2mop collect --collectors gh,sm
dop2mop [options]
Commands: collect Collect data from DevOps/MLOps platforms demo Generate demo data with attack scenarios
### 全局选项
| 选项 | 描述 |
|--------|-------------|
| `-v, --verbose` | 启用详细输出(INFO 级别日志记录) |
| `--debug` | 启用调试输出(DEBUG 级别日志记录) |
---
### `dop2mop collect`
从配置的 DevOps 和 MLOps 平台收集数据。```bash
dop2mop collect [OPTIONS]
| 选项 | 描述 |
|---|---|
--github-token TOKEN | GitHub 个人访问令牌 |
--github-org ORG | GitHub 组织名称 |
--github-enterprise-url URL | GitHub 企业版服务器 URL |
| 选项 | 描述 |
|---|---|
--azure-devops-token TOKEN | Azure DevOps 个人访问令牌 (PAT) |
--azure-devops-access-token TOKEN | Azure DevOps 访问令牌(Bearer 认证,可选) |
--azure-devops-org ORG | Azure DevOps 组织名称 |
| 选项 | 描述 |
|---|---|
--aws-access-key-id KEY |
dop2mop demo生成演示数据,展示研究中的四种攻击场景。```bash dop2mop demo [OPTIONS]
| Option | 描述 |
|--------|------|
| `-o, --output FILE` | 输出文件路径(默认:`dop2mop_demo.json`) |
---
### `dop2mop icons`
为 BloodHound 节点类型生成自定义图标配置。```bash
dop2mop icons [OPTIONS]
| 选项 | 描述 |
|---|---|
-o, --output FILE | 输出文件路径(默认:dop2mop_icons.json) |
dop2mop collect -o output.json
dop2mop collect --config dop2mop.yaml -o output.json -v
dop2mop collect --validate -o output.json -v
dop2mop collect -o output.json -v
dop2mop collect -o output.json --debug
dop2mop collect -o output.json --zip
dop2mop collect --max-items 100 -o output.json
dop2mop collect --no-secrets -o output.json
### 单平台集合```bash
# GitHub only (aliases: github, gh)
dop2mop collect --collectors github -o github.json -v
# Azure DevOps only (aliases: ado, azuredevops)
dop2mop collect --collectors ado -o ado.json -v
# Azure ML only (aliases: azureml, azure-ml)
dop2mop collect --collectors azureml -o azureml.json -v
# SageMaker only (aliases: sagemaker, sm)
dop2mop collect --collectors sm -o sagemaker.json -v
dop2mop collect --collectors github,sagemaker -o output.json -v
dop2mop collect --collectors github,ado -o output.json -v
dop2mop collect --collectors ado,azureml -o azure.json -v
dop2mop collect --collectors github,ado,azureml,sagemaker -o full.json -v
### GitHub 收藏集示例```bash
# Using environment variables
export GITHUB_TOKEN="ghp_xxxxxxxxxxxx"
export GITHUB_ORG="your-org"
dop2mop collect --collectors GitHubCollector -o github.json -v
# Using command-line arguments
dop2mop collect --collectors GitHubCollector \
--github-token ghp_xxxxxxxxxxxx \
--github-org your-org \
-o github.json -v
# GitHub Enterprise Server
dop2mop collect --collectors GitHubCollector \
--github-token ghp_xxxxxxxxxxxx \
--github-org your-org \
--github-enterprise-url https://github.yourcompany.com/api/v3 \
-o github.json -v
# Skip secret enumeration
dop2mop collect --collectors GitHubCollector \
--github-token ghp_xxxxxxxxxxxx \
--github-org your-org \
--no-secrets \
-o github.json -v
# Limit to 50 repositories
dop2mop collect --collectors GitHubCollector \
--github-token ghp_xxxxxxxxxxxx \
--github-org your-org \
--max-items 50 \
-o github.json -v
export AZURE_DEVOPS_TOKEN="your-pat" export AZURE_DEVOPS_ORG="your-org" dop2mop collect --collectors AzureDevOpsCollector -o ado.json -v
dop2mop collect --collectors AzureDevOpsCollector
--azure-devops-token your-pat
--azure-devops-org your-org
-o ado.json -v
dop2mop collect --collectors AzureDevOpsCollector
--azure-devops-access-token eyJ0...
--azure-devops-org your-org
-o ado.json -v
> **注意:** Azure DevOps 身份验证优先级:访问令牌(Bearer)> PAT(Basic)。
> 访问令牌可以通过 `az account get-access-token --resource 499b84ac-1321-427f-aa17-267ca6975798` 获取。
### Azure ML 集合示例```bash
# Using environment variables
export AZURE_SUBSCRIPTION_ID="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
export AZURE_TENANT_ID="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
dop2mop collect --collectors AzureMLCollector -o azureml.json -v
# Using DefaultAzureCredential (az login)
dop2mop collect --collectors AzureMLCollector \
--azure-subscription-id xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx \
--azure-tenant-id xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx \
-o azureml.json -v
# Using Service Principal
dop2mop collect --collectors AzureMLCollector \
--azure-subscription-id xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx \
--azure-tenant-id xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx \
--azure-client-id xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx \
--azure-client-secret your-secret \
-o azureml.json -v
# Using Access Token
dop2mop collect --collectors AzureMLCollector \
--azure-subscription-id xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx \
--azure-tenant-id xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx \
--azure-access-token eyJ0... \
-o azureml.json -v
注意: Azure ML 身份验证优先级:访问令牌 > 服务主体 > DefaultAzureCredential(az login)。 可以通过
az account get-access-token --resource https://management.azure.com/获取访问令牌。
export AWS_PROFILE="your-profile" dop2mop collect --collectors SageMakerCollector -o sagemaker.json -v
dop2mop collect --collectors SageMakerCollector
--aws-profile your-profile
-o sagemaker.json -v
dop2mop collect --collectors SageMakerCollector
--aws-access-key-id AKIAXXXXXXXXXXXXXXXX
--aws-secret-access-key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
--aws-region us-east-1
-o sagemaker.json -v
dop2mop collect --collectors SageMakerCollector
--aws-profile your-profile
--aws-region us-west-2
-o sagemaker.json -v
### 完整环境收集```bash
# Set all environment variables
export GITHUB_TOKEN="ghp_xxxxxxxxxxxx"
export GITHUB_ORG="your-org"
export AZURE_DEVOPS_TOKEN="your-pat"
export AZURE_DEVOPS_ORG="your-org"
export AZURE_SUBSCRIPTION_ID="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
export AZURE_TENANT_ID="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
export AWS_PROFILE="your-profile"
# Collect from all platforms (auto-detects configured collectors)
dop2mop collect -o full_collection.json -v
# Or with explicit collectors
dop2mop collect \
--collectors GitHubCollector,AzureDevOpsCollector,AzureMLCollector,SageMakerCollector \
-o full_collection.json -v
所有命令行选项都可以通过环境变量设置:
优先级: CLI 参数 > 配置文件 > 环境变量。
| 类型 | 描述 |
|---|---|
ServicePrincipal | Azure AD 服务主体 |
IAMRole | AWS IAM 角色 |
OIDCIdentity | OIDC 联合身份 |
| 类型 | 描述 |
|---|---|
ContainerRegistry | 容器注册表(ECR、ACR) |
ContainerImage | 容器镜像 |
S3Bucket | AWS S3 存储桶 |
当显式 API 数据不可用时(例如,存储在密钥中的角色 ARN),这些边通过启发式分析创建。它们使用不同的边类型,以便在 BloodHound 查询中过滤。
| 类型 | 描述 |
|---|---|
InferredCanAssumeRole | OIDC 身份可能能够承担角色(推断) |
InferredSubmitsJob | 工作流可能通过 OIDC 提交训练作业(推断) |
参见 queries/dop2mop_queries.cypher 获取全面的查询示例。
Dop2Mop 在 data/custom_icons.json 中为 BloodHound 自定义节点类型提供了一个预配置的图标文件。
custom_icons.json 的内容首先,在 BloodHound 中创建 API 令牌:
然后使用以下 Python 脚本上传:```python #!/usr/bin/env python3 """Upload custom icons to BloodHound CE using HMAC authentication."""
import base64 import hashlib import hmac import json from datetime import datetime, timezone import requests
BLOODHOUND_URL = "http://localhost:8080" TOKEN_ID = "your-token-id" TOKEN_KEY = "your-token-key" ICONS_FILE = "custom_icons.json"
def hmac_auth(method: str, uri: str, body: bytes = b"") -> dict: """Generate HMAC authentication headers.""" digester = hmac.new( base64.b64decode(TOKEN_KEY), msg=None, digestmod=hashlib.sha256 )
now = datetime.now(timezone.utc)
timestamp = now.strftime("%Y-%m-%dT%H:%M:%SZ")
digester.update(f"{method}".encode())
digester.update(f"{uri}".encode())
digester.update(timestamp.encode())
if body:
digester.update(body)
signature = base64.b64encode(digester.digest()).decode()
return {
"Authorization": f"bhesignature {TOKEN_ID}",
"RequestDate": timestamp,
"Signature": signature,
"Content-Type": "application/json",
}
def upload_icons(): """Upload custom icons to BloodHound.""" uri = "/api/v2/custom-nodes" url = f"{BLOODHOUND_URL}{uri}"
with open(ICONS_FILE, "rb") as f:
body = f.read()
headers = hmac_auth("POST", uri, body)
response = requests.post(url, headers=headers, data=body)
print(f"Status: {response.status_code}")
print(f"Response: {response.text}")
return response.status_code == 200
if name == "main": upload_icons()
#### Option 3: Bearer Token (Quick Testing)
从浏览器DevTools的网络选项卡中获取JWT,同时登录到BloodHound:```bash
curl -X POST http://localhost:8080/api/v2/custom-nodes \
-H "Authorization: Bearer eyJ..." \
-H "Content-Type: application/json" \
-d @custom_icons.json
from dop2mop import Dop2MopCollector, CollectorConfig
config = CollectorConfig( github_token="ghp_xxx", github_org="myorg", aws_profile="default", )
collector = Dop2MopCollector(config) results = collector.validate_all() print(results) # {'GitHubCollector': True, 'SageMakerCollector': True, ...}
collector.run(collectors=["github", "sm"])
collector.save("output.json")
print(collector.get_stats())
print(collector.get_collection_summary())
### 使用独立的收集器```python
from dop2mop import CollectorConfig, GitHubCollector, SageMakerCollector
from dop2mop.graph import OpenGraphBuilder
# Create shared builder
builder = OpenGraphBuilder(source_kind="MLOpsBase")
# Configure
config = CollectorConfig(
github_token="ghp_xxx",
github_org="myorg",
aws_profile="default",
)
# Run individual collectors
github = GitHubCollector(config, builder)
github.collect()
sagemaker = SageMakerCollector(config, builder)
sagemaker.collect()
# Save combined output
builder.save("combined.json")
from dop2mop.graph import OpenGraphBuilder from dop2mop.models import NodeKind, EdgeType
builder = OpenGraphBuilder(source_kind="CustomSource")
builder.create_node( id="my-pipeline", kinds=[NodeKind.AZURE_DEVOPS_PIPELINE.value], name="My Pipeline", displayname="Production Pipeline", )
builder.create_node( id="my-ml-workspace", kinds=[NodeKind.AZURE_ML_WORKSPACE.value], name="ML Workspace", displayname="Training Workspace", )
builder.create_edge( start_id="my-pipeline", end_id="my-ml-workspace", kind=EdgeType.SUBMITS_JOB, properties={"trust_boundary": "TB4"} )
builder.save("custom_graph.json")
---
## 故障排除
### 首先验证
始终从凭证验证开始,及早发现认证问题:```bash
dop2mop collect --validate --collectors github,sm -v
The output will show OK/FAILED per collector before any collection begins.
Total Nodes: 142 DevOps: 45 MLOps: 38 Identity: 12 Artifact: 47
Total Edges: 201 Contains: 62 TriggersPipeline: 15 ...
──────────────────────────────────────────────────────── Collection Issues: GitHubCollector: 45 collected, 3 failed, 1 skipped FAIL: branch_protection:org/repo - 404 Not Found SKIP: branch_protection:org/private - Insufficient permissions
### 常见问题
**"GitHub收集器未配置,正在跳过"**
- 确保设置了环境变量 `GITHUB_TOKEN` 和 `GITHUB_ORG`,或者传递 `--github-token` 和 `--github-org` 参数
**"Azure ML收集器未配置,正在跳过"**
- 确保设置了 `AZURE_SUBSCRIPTION_ID` 和 `AZURE_TENANT_ID`
- 如果使用 DefaultAzureCredential,请运行 `az login`
- 或者,使用来自 `az account get-access-token` 的有效令牌传递 `--azure-access-token`
**"SageMaker收集器未配置,正在跳过"**
- 设置 `AWS_PROFILE`,或者同时设置 `AWS_ACCESS_KEY_ID` 和 `AWS_SECRET_ACCESS_KEY`
- 确保凭据具有 SageMaker 读取权限
**分支保护返回403**
- GitHub API 需要管理员权限才能读取分支保护规则
- 非管理员令牌将跳过分支保护收集(在摘要中报告)
**速率限制(429错误)**
- Dop2Mop 在遇到速率限制响应时会自动使用指数退避重试
- 对于大型组织,使用 `--max-items` 减少 API 调用
- GitHub 速率限制:已验证用户 5,000 次请求/小时
**在 BloodHound Cypher 控制台中没有结果**
- 确保查询返回完整节点(`RETURN a, b`),而不是属性(`RETURN a.name, b.name`)
- BloodHound 的 Cypher 控制台用于图形可视化,而不是表格数据
- 对于基于属性的查询,请使用 Neo4j 浏览器(localhost:7474)
**过滤推断边与收集边**
- 推断边使用不同的类型(例如,`InferredCanAssumeRole` 而不是 `CanAssumeRole`)
- 仅查询已确认的边:`MATCH p=()-[:CanAssumeRole]->() RETURN p`
- 查询推断边:`MATCH p=()-[:InferredCanAssumeRole]->() RETURN p`
---
## 许可协议
MIT 许可协议 - 详见 [LICENSE](https://github.com/h4wkst3r/dop2mop/blob/main/LICENSE)。
| 选项 | 描述 |
|---|
-o, --output FILE | 输出文件路径(默认:dop2mop_output.json) |
--zip | 将输出压缩为 ZIP 文件 |
--config FILE | YAML/JSON 配置文件路径 |
--validate | 在收集前验证凭据 |
--collectors LIST | 逗号分隔的收集器或别名列表(如 github,sm) |
--max-items N | 每类收集的最大项目数 |
--no-secrets | 跳过密钥/凭据枚举 |
| 选项 | 描述 |
|---|
--azure-subscription-id ID | Azure 订阅 ID |
--azure-tenant-id ID | Azure AD 租户 ID |
--azure-client-id ID | 服务主体客户端 ID(可选) |
--azure-client-secret SECRET | 服务主体客户端密钥(可选) |
--azure-access-token TOKEN | Azure ML 认证所用的 Azure 访问令牌(可选) |
| AWS 访问密钥 ID |
--aws-secret-access-key SECRET | AWS 秘密访问密钥 |
--aws-region REGION | AWS 区域(默认:us-east-1) |
--aws-profile PROFILE | AWS CLI 配置文件名称 |
| 收集器名称 | 平台 | 所需凭据 |
|---|
GitHubCollector | GitHub | --github-token, --github-org |
AzureDevOpsCollector | Azure DevOps | --azure-devops-token 或 --azure-devops-access-token, --azure-devops-org |
AzureMLCollector | Azure ML | --azure-subscription-id, --azure-tenant-id |
SageMakerCollector | AWS SageMaker | --aws-profile 或 --aws-access-key-id |
| 环境变量 | CLI 等价选项 | 描述 |
|---|
GITHUB_TOKEN | --github-token | GitHub 个人访问令牌 |
GITHUB_ORG | --github-org | GitHub 组织名称 |
GITHUB_ENTERPRISE_URL | --github-enterprise-url | GitHub Enterprise 服务器 URL |
AZURE_DEVOPS_TOKEN | --azure-devops-token | Azure DevOps PAT |
AZURE_DEVOPS_ACCESS_TOKEN | --azure-devops-access-token | Azure DevOps 访问令牌(Bearer) |
AZURE_DEVOPS_ORG | --azure-devops-org | Azure DevOps 组织 |
AZURE_SUBSCRIPTION_ID | --azure-subscription-id | Azure 订阅 ID |
AZURE_TENANT_ID | --azure-tenant-id | Azure AD 租户 ID |
AZURE_CLIENT_ID | --azure-client-id | Azure 服务主体客户端 ID |
AZURE_CLIENT_SECRET | --azure-client-secret | Azure 服务主体机密 |
AZURE_ACCESS_TOKEN | --azure-access-token | Azure ML 的访问令牌 |
AWS_ACCESS_KEY_ID | --aws-access-key-id | AWS 访问密钥 ID |
AWS_SECRET_ACCESS_KEY | --aws-secret-access-key | AWS 秘密访问密钥 |
AWS_REGION | --aws-region | AWS 区域(默认:us-east-1) |
AWS_PROFILE | --aws-profile | AWS CLI 配置文件名称 |
| 类型 | 描述 |
|---|
GHOrganization | GitHub 组织 |
GHRepository | GitHub 仓库 |
GHWorkflow | GitHub Actions 工作流 |
GHSecret | GitHub Actions 密钥 |
ADOOrganization | Azure DevOps 组织 |
ADOProject | Azure DevOps 项目 |
ADOPipeline | Azure DevOps 管道 |
ADOServiceConnection | Azure DevOps 服务连接(NHI)及作用域详情 |
ADOAgent | Azure DevOps 代理池(托管或自托管) |
ADOVariableGroup | Azure DevOps 变量组 |
| 类型 | 描述 |
|---|
AzMLWorkspace | Azure ML 工作区 |
AzMLCompute | Azure ML 计算集群/实例 |
AzMLExperiment | Azure ML 作业/实验 |
AzMLDatastore | Azure ML 数据存储 |
AzMLEnvironment | Azure ML 环境(容器定义) |
AzMLModel | Azure ML 已注册模型 |
SMDomain | SageMaker Studio 域 |
SMTrainingJob | SageMaker 训练作业 |
SMModel | SageMaker 模型 |
SMEndpoint | SageMaker 端点(也用于 Azure ML 端点) |
SMNotebook | SageMaker Notebook 实例 |
ManagedIdentity |
| Azure 托管标识 |
Dataset| ML 数据集 |
| 类型 | 信任边界 | 描述 |
|---|
TriggersPipeline | TB1 | 代码提交触发 CI/CD |
HasBranchProtection | TB1 | 仓库有分支保护规则 |
BypassesProtection | TB1 | 弱/缺失分支保护(可被利用) |
AuthenticatesAs | TB2 | 管道使用服务主体 |
CanAssumeRole | TB2 | OIDC 身份可承担 IAM 角色 |
OIDCTrust | TB2 | 工作流使用 OIDC 联合 |
UsesServiceConnection | TB2 | 管道使用 ADO 服务连接 |
PullsImage | TB3 | 训练作业拉取容器镜像 |
CanPoisonImage | TB3 | 管道可修改容器镜像 |
SubmitsJob | TB4 | 服务主体提交 ML 作业 |
CodeExecution | TB4 | 作业在计算资源上执行代码 |
LoadsDataset | TB5 | 训练作业加载数据集 |
CanPoisonDataset | TB5 | 管道可修改数据集 |
Deserializes | TB5 | 不安全的反序列化 |
InferredPullsImage| 训练作业可能拉取被污染的容器镜像(推断) |
InferredLoadsDataset | 训练作业可能加载被污染的数据集(推断) |
| 类型 | 描述 |
|---|
Contains | 父子关系 |
MemberOf | 组成员关系 |
HasAccessTo | 访问资源的权限 |
HasExecutionRole | 资源使用 IAM/执行角色 |
Owns | 所有权关系 |