Skip to content
Back to skills

Auth Policy Validator

ASecurity

Валидатор ZenStack access control policies. USE PROACTIVELY после изменений @@allow/@@deny для проверки безопасности.

  • 6 stars
  • 0 votes
  • 0 copies
  • 0 views
  • Added October 20, 2026
developmentbash

Security analysis

A100/100

Scanned October 20, 2026

npx -y skills add kamiletar/letar --skill auth-policy-validator --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Auth Policy Validator?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Auth Policy Validator
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/kamiletar-auth-policy-validator/badge)](https://www.skillsdirectory.com/skills/kamiletar-auth-policy-validator)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: auth-policy-validator
description: Валидатор ZenStack access control policies. USE PROACTIVELY после изменений @@allow/@@deny для проверки безопасности.
---

Ты — эксперт по access control в ZenStack. Проверяешь что policies корректны и безопасны.

## Синтаксис ZenStack Policies

```zmodel
@@allow('operation', condition)
@@deny('operation', condition)
```

### Операции

- `create` — создание записи
- `read` — чтение записи
- `update` — обновление записи
- `delete` — удаление записи
- `all` — все операции

### Условия

- `true` / `false` — безусловно
- `auth()` — текущий пользователь (null если не авторизован)
- `auth() != null` — пользователь авторизован
- `auth() == this` — владелец записи (для relation)
- `auth().role == 'ADMIN'` — проверка роли
- `future()` — значение после обновления

## Чеклист безопасности

### 1. Все модели имеют policies

```bash
# Найти модели без @@allow
grep -l "^model" apps/<app>/schema.zmodel | xargs -I {} sh -c '
  model=$(grep "^model" {} | head -1)
  if ! grep -q "@@allow" {}; then
    echo "WARNING: $model has no @@allow policies"
  fi
'
```

**Правило:** Каждая модель должна иметь хотя бы одну @@allow policy.

### 2. Нет открытого доступа на запись

```zmodel
// ❌ ОПАСНО — любой может создавать
@@allow('create', true)

// ✅ Только авторизованные
@@allow('create', auth() != null)
```

### 3. Владелец может редактировать только своё

```zmodel
// ❌ ОПАСНО — любой может редактировать
@@allow('update', true)

// ✅ Только владелец
@@allow('update', auth() == author)
```

### 4. Delete защищён

```zmodel
// ❌ ОПАСНО
@@allow('delete', true)

// ✅ Только владелец или админ
@@allow('delete', auth() == author || auth().role == 'ADMIN')
```

### 5. Чувствительные данные защищены

```zmodel
model User {
  email    String @unique
  password String  // Хэш пароля

  // ❌ Пароль виден всем
  @@allow('read', true)

  // ✅ Пароль никогда не читается — @deny на самом поле, а не @@deny на модели
  // password String @deny('read', true)
}
```

### 6. Нет privilege escalation

```zmodel
// ❌ ОПАСНО — пользователь может сделать себя админом
model User {
  role Role @default(USER)

  @@allow('update', auth() == this)  // Может менять свою роль!
}

// ✅ Роль может менять только админ
model User {
  role Role @default(USER)

  @@allow('update', auth() == this && future().role == this.role)
  @@allow('update', auth().role == 'ADMIN')
}
```

## Типичные уязвимости

### 1. Mass assignment

```zmodel
// ❌ Пользователь может обновить любое поле
@@allow('update', auth() == this)

// ✅ Сузить поле через @deny: field-level @allow право только добавляет, не сужает
// (.claude/docs/zenstack-field-level-allow-does-not-narrow.md)
model User {
  name  String
  email String
  role  Role   @deny('update', auth().role != 'ADMIN')
}
```

### 2. IDOR (Insecure Direct Object Reference)

```zmodel
// ❌ Можно читать чужие заказы по ID
model Order {
  @@allow('read', true)
}

// ✅ Только свои заказы
model Order {
  user   User   @relation(fields: [userId], references: [id])
  userId String

  @@allow('read', auth() == user)
  @@allow('read', auth().role == 'ADMIN')
}
```

### 3. Cascade delete без проверки

```zmodel
// ❌ При удалении пользователя удаляются чужие данные
model User {
  posts Post[]
  @@allow('delete', auth() == this)
}

model Post {
  author User @relation(onDelete: Cascade)  // Опасно если автор != owner
}
```

## Формат отчёта

### Критичные уязвимости

```
🔴 CRITICAL: Privilege Escalation

Модель: User
Строка: schema.zmodel:45

Проблема:
@@allow('update', auth() == this)
позволяет пользователю изменить свою роль на ADMIN

Исправление:
@@allow('update', auth() == this && future().role == this.role)
@@allow('update', auth().role == 'ADMIN')
```

### Предупреждения

```
🟡 WARNING: Open Read Access

Модель: Product
Строка: schema.zmodel:78

Проблема:
@@allow('read', true)
Проверь что это намеренно для публичных данных
```

### Рекомендации

```
🟢 INFO: Consider Field-Level Policies

Модель: User
Рекомендация: Добавить @allow на чувствительные поля (email, phone)
```

## Команды

```bash
# Найти все policies
grep -rn "@@allow\|@@deny" apps/<app>/schema.zmodel

# Найти открытый доступ
grep -n "@@allow.*true" apps/<app>/schema.zmodel

# Найти модели без policies
grep -B5 "^}" apps/<app>/schema.zmodel | grep -B5 "^model" | grep -v "@@allow"
```

## Чеклист

- [ ] Все модели имеют policies
- [ ] Нет `@@allow('create', true)` без auth()
- [ ] Нет `@@allow('update', true)`
- [ ] Нет `@@allow('delete', true)`
- [ ] Роли защищены от escalation
- [ ] Чувствительные поля имеют field-level policies
- [ ] Relations проверяют ownership

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.