Project Liquidはセキュリティを最優先事項として設計されています。
| Version | Supported |
|---|---|
| 0.1.x | ✅ |
| < 0.1 | ❌ |
セキュリティ脆弱性を発見した場合:
- 公開しないでください - GitHubのPublic Issueには投稿しないでください
- GitHub Security Advisoriesを使用してください
- Security Advisoriesで非公開報告
- 対応目標: 48時間以内に初回応答
- 脆弱性の詳細な説明
- 再現手順
- 影響範囲の評価
- 可能であれば修正案
Project Liquidは「AIにコードを書かせない」という根本原則に基づいています。
従来のAI UI生成:
User → AI → JavaScript/SQL生成 → 実行 → XSS/SQLインジェクション
Liquidのアプローチ:
User → AI → JSONスキーマのみ → Rust型検証 → 安全なORM実行
AIが生成できるもの:
- JSONスキーマ(UIコンポーネント定義)
- DataSource定義(フィルタ、集計、ソート)
AIが生成できないもの:
- JavaScript/TypeScriptコード
- SQLクエリ
- シェルコマンド
- 任意の実行可能コード
Rust型システムによる厳格な検証:
// 定義外フィールドは即座にエラー
#[serde(deny_unknown_fields)]
pub struct LiquidViewSchema {
pub version: String,
pub components: Vec<Component>,
// ...
}- 不正なスキーマは実行前に拒否
- 型安全性により想定外の動作を防止
- エラーメッセージは詳細だが安全
// 全クエリにユーザーコンテキストを強制適用
pub fn apply_rls(query: Query, user: &CurrentUser) -> Query {
query.where_clause(format!("user_id = {}", user.id))
}- ユーザーは自分のデータのみアクセス可能
- 管理者でも明示的な権限なしに他ユーザーデータにアクセス不可
- デフォルトで最小権限原則を適用
Layer 1: 入力検証(TypeScript)
↓ Validated Input
Layer 2: スキーマ検証(Rust型システム)
↓ Safe Schema
Layer 3: DataSource変換(ORM専用)
↓ Safe Query
Layer 4: Row-Level Security
↓ Authorized Data
Layer 5: 出力エンコーディング(React自動エスケープ)
// DDoS保護: 10リクエスト/分
const rateLimiter = createRateLimiter({
windowMs: 60 * 1000,
max: 10,
});// 全ての入力を検証
function validateString(input: unknown, maxLength: number): string {
if (typeof input !== 'string') throw new ValidationError();
if (input.length > maxLength) throw new ValidationError();
return sanitize(input);
}フロントエンドでは厳格なCSPを推奨:
Content-Security-Policy:
default-src 'self';
script-src 'self';
style-src 'self' 'unsafe-inline';
img-src 'self' data:;
新機能追加時に確認:
- AIの出力がJSONスキーマのみであることを確認
- 新しいフィールドがRust型定義に追加されているか
- Row-Level Securityが適用されているか
- 入力検証が実装されているか
- エラーメッセージに機密情報が含まれていないか
- テストでセキュリティケースがカバーされているか
# npm依存関係の監査
npm audit
# Rustクレートの監査
cargo audit定期的に依存関係を更新し、既知の脆弱性を排除してください。
セキュリティ研究者の皆様のご協力に感謝いたします。 責任ある開示にご協力いただいた方は、許可を得た上でこの文書で謝辞を掲載させていただきます。