6 cái bẫy quyền hạn trong Claude Code khiến lập trình viên đau đầu tuần qua

06 tháng 4, 2026·5 phút đọc

Sau khi xử lý 57 vấn đề trên GitHub về quyền hạn trong Claude Code hoạt động không như mong đợi, tôi đã tổng hợp 6 mô hình lỗi thường gặp nhất. Bài viết này sẽ chỉ ra những cái bẫy đó và các giải pháp sử dụng hooks để khắc phục triệt để.

6 cái bẫy quyền hạn trong Claude Code khiến lập trình viên đau đầu tuần qua

Tuần này, tôi đã dành thời gian giải quyết 57 vấn đề (Issues) trên GitHub liên quan đến hệ thống quyền hạn trong Claude Code không hoạt động theo như kỳ vọng. Dưới đây là 6 mô hình "cái bẫy" thường xuyên khiến người dùng vấp váp, cùng với các cách khắc phục sử dụng hooks.

Cái bẫy 1: allow hủy bỏ ask

Cấu hình quyền hạn thường bị hiểu lầm là sẽ ưu tiên an toàn, nhưng thực tế lại ngược lại.

Hãy xem xét cấu hình sau:

{
  "permissions": {
    "allow": ["Bash(*)"],
    "ask": ["Bash(rm *)"]
  }
}

Kỳ vọng: Các lệnh an toàn sẽ tự động phê duyệt, còn lệnh rm sẽ hỏi trước.

Thực tế: Mọi thứ đều được tự động phê duyệt. Lệnh ask bị bỏ qua một cách âm thầm. (Vấn đề #6527)

Cách khắc phục: Sử dụng một PreToolUse hook để bắt những gì mà ask đã bỏ lỡ:

#!/bin/bash
COMMAND=$(cat | jq -r '.tool_input.command // empty')
if echo "$COMMAND" | grep -qE 'rm\s+(-[rf]+\s+)*(\/|~|\.\./)'; then
    echo "BLOCKED: rm on sensitive path" >&2
    exit 2
fi
exit 0

Cái bẫy 2: Dấu đại diện ở cuối không khớp với đối số bằng 0

Khi sử dụng ký tự đại diện (wildcard) ở cuối, nhiều người ngờ ngàng khi nó không hoạt động nếu không có tham số đi kèm.

Ví dụ:

{ "permissions": { "allow": ["Bash(ssh * uptime *)"] } }
  • Lệnh ssh host uptime -s → Được phép.
  • Lệnh ssh host uptimeBị hỏi xác nhận.

Dấu đại diện ở cuối * yêu cầu phải có ít nhất một ký tự. (Vấn đề #36873)

Cách khắc phục: Sử dụng regex (\s|$) trong hook — khớp với "khoảng trắng hoặc kết thúc chuỗi":

if echo "$COMMAND" | grep -qE '^\s*ssh\s+\S+\s+uptime(\s|$)'; then
    # auto-approve
fi

Cái bẫy 3: Quy tắc Edit/Write bị bỏ qua trên Windows

Đặt quy tắc Edit(.claude/**) trong file settings.json không có tác dụng trên VS Code chạy Windows. Các quy tắc Bash hoạt động tốt, nhưng Edit/Write thì không. (Vấn đề #36884)

Cách khắc phục: Một PermissionRequest hook có thể bỏ qua bộ so khớp bị lỗi này:

TOOL=$(cat | jq -r '.tool_name // empty')
if [[ "$TOOL" == "Edit" || "$TOOL" == "Write" ]]; then
    jq -n '{"hookSpecificOutput":{"hookEventName":"PermissionRequest","permissionDecision":"allow"}}'
fi

Cái bẫy 4: Các thư mục được bảo vệ bỏ qua bypassPermissions

Kể từ phiên bản v2.1.78, các thư mục như .git, .claude, .vscode vẫn sẽ yêu cầu xác thực ngay cả khi bạn sử dụng cờ --dangerously-skip-permissions. Đây là tính năng có chủ đích nhưng không được ghi lại trong tài liệu. (Vấn đề #35646)

Cách khắc phục: Anthropic đã xác nhận rằng một bản sửa lỗi sắp được tung ra.

Cái bẫy 5: Lệnh /model không cập nhật /status ngay lập tức

Lệnh /model thay đổi mô hình cho các lệnh gọi API trong tương lai, nhưng /status vẫn hiển thị mô hình cũ. (Vấn đề #36835)

Cách khắc phục: Gửi một tin nhắn mới sau khi chạy /model, hoặc thiết lập thông qua biến môi trường:

export ANTHROPIC_MODEL=claude-opus-4-6

Cái bẫy 6: Claude thêm các cờ (flags) mà mẫu của bạn không mong đợi

Bạn cho phép lệnh Bash(git status:*). Tuy nhiên, Claude lại chạy git -C /path status. Cờ -C sẽ làm hỏng mẫu khớp của bạn. (Vấn đề #36900)

Cách khắc phục: Khớp với cờ tùy chọn trong hook:

if echo "$COMMAND" | grep -qE '^\s*git\s+(-C\s+\S+\s+)?(status|log|diff|branch|show)'; then
    # auto-approve
fi

Lưu ý bổ sung: Hook "deny" không chặn được Edit/Write

Khi hook của bạn trả về permissionDecision: "deny" với mã thoát 2. Đối với lệnh Bash, công cụ sẽ bị chặn. Nhưng với Edit/Write — tệp vẫn bị sửa đổi. (Vấn đề #37210)

Cách khắc phục: Phòng thủ nhiều lớp — hãy làm cho tệp chỉ có quyền đọc trước khi từ chối:

if [[ "$TOOL" == "Edit" || "$TOOL" == "Write" ]]; then
    if should_deny "$FILE"; then
        chmod 444 "$FILE" 2>/dev/null
        echo "BLOCKED: Edit denied by policy" >&2
        exit 2
    fi
fi

Mẫu chung cho giải pháp

6 trong số 7 cái bẫy trên đều có một giải pháp giống nhau: PreToolUse hooks. Hệ thống quyền hạn có các trường hợp ngoại lệ biên (edge cases), nhưng hooks hoạt động độc lập và không gặp vấn đề này.

Bạn có thể thiết lập nhanh chóng bằng lệnh:

npx cc-safe-setup

Công cụ này cung cấp 8 hooks trong vòng 10 giây, bao gồm các lệnh phá hủy, force push, rò rỉ file .env, lỗi cú pháp và giám sát ngữ cảnh.

Bạn có thể tìm thêm chi tiết trên GitHub tại đây.

Mọi cái bẫy trong danh sách này đều đến từ các vấn đề GitHub thực tế mà tôi đã phản hồi trong tuần qua. Nếu bạn gặp vấn đề về quyền hạn không được liệt kê ở đây, hãy để lại bình luận — tôi sẽ thêm nó vào.

Ngoài ra, bạn có thể tham khảo Claude Code Production Guide để học hỏi kinh nghiệm từ hơn 700 giờ vận hành tự động.

Thiết lập Claude Code của bạn có thực sự an toàn không? Hãy chạy npx cc-health-check — một công cụ chẩn đoán miễn phí với 20 điểm kiểm tra. Điểm số dưới 80? Claude Code Ops Kit sẽ sửa mọi thứ chỉ với một lệnh duy nhất.

Bài viết được tổng hợp và biên soạn bằng AI từ các nguồn tin tức công nghệ. Nội dung mang tính tham khảo. Xem bài gốc ↗