JAVA.SV.LLM.VECTOR.NOFILTER

テナントスコープのフィルタリングが適用されていないベクトル検索

JAVA.SV.LLM.VECTOR.NOFILTER チェッカーは、テナントスコープのフィルタリングが適用されていないベクトルクエリまたは検索クエリを特定します。

脆弱性とリスク

テナントスコープのフィルタリングを行わずにベクトルクエリや検索クエリを実行すると、あるユーザーが別のユーザーのデータにアクセスできてしまう可能性があります。

軽減と防止

ベクトルクエリまたは検索クエリを実行する前に、現在のプリンシパルまたはテナントから導出したフィルターを適用します。

脆弱コード例

コピー
import org.springframework.ai.vectorstore.SearchRequest;
import org.springframework.ai.vectorstore.VectorStore;

public class Example {
    private final VectorStore vectorStore;

    public Example(VectorStore vectorStore) {
        this.vectorStore = vectorStore;
    }

    public void search(String query) {
        vectorStore.similaritySearch(
            SearchRequest.query(query)
                .topK(5)); // no tenant-scoped filter
    }
}

修正コード例

コピー
import org.springframework.ai.vectorstore.SearchRequest;
import org.springframework.ai.vectorstore.VectorStore;

public class Example {
    private final VectorStore vectorStore;

    public Example(VectorStore vectorStore) {
        this.vectorStore = vectorStore;
    }

    public void search(String query, UserPrincipal principal) {
        vectorStore.similaritySearch(
            SearchRequest.query(query)
                .topK(5)
                .filterExpression("tenantId == '" + principal.getTenantId() + "'"));
    }
}