iris_android is a privacy-first, on-device AI assistant. Security and privacy are fundamental to our mission. This document outlines our security practices, how to report vulnerabilities, and what users can expect from us.
- On-Device Processing Only: All AI inference happens locally. No data is transmitted to external servers.
- No Telemetry: We do not collect usage data, analytics, or telemetry.
- Minimal Permissions: We request only the permissions necessary for core functionality.
- Encrypted Storage: Sensitive data is stored using Android's encrypted preferences.
- Open Source: All code is public and auditable.
- No Network Calls: AI models run entirely offline
- User Consent: Explicit consent required for accessing sensitive data
- Data Minimization: We collect and store only what's necessary
- Local Storage: All data remains on the device
- Secure Deletion: Proper data deletion when requested
We provide security updates for the following versions:
| Version | Supported | Notes |
|---|---|---|
| 1.x.x | β Supported | Current stable release |
| 0.x.x | β Not Supported | Beta/development versions |
Please DO NOT create public GitHub issues for security vulnerabilities.
Instead, use GitHub's Security Advisory feature:
- Navigate to the Security tab
- Click "Advisories" β "New draft security advisory"
- Provide detailed information about the vulnerability
Your security report should include:
- Description: Clear description of the vulnerability
- Impact: What could an attacker achieve?
- Affected Components: Which parts of the app are affected?
- Steps to Reproduce: Detailed steps to reproduce the issue
- Proof of Concept: Code or screenshots demonstrating the vulnerability
- Suggested Fix: If you have ideas for fixing it
- Environment: App version, Android version, device model
- Initial Response: Within 48 hours
- Severity Assessment: Within 1 week
- Fix Development: Varies by severity (see below)
- Public Disclosure: After fix is released and users have time to update
| Severity | Response Time | Examples |
|---|---|---|
| Critical | 24-48 hours | Remote code execution, data exfiltration |
| High | 1 week | Privilege escalation, sensitive data exposure |
| Medium | 2-4 weeks | Information disclosure, DoS |
| Low | Best effort | Minor information leaks, theoretical attacks |
- Input Validation: All user inputs properly validated and sanitized
- SQL Injection: No raw SQL queries, use parameterized queries
- Path Traversal: File paths properly validated
- Intent Security: Intent filters properly configured
- WebView Security: JavaScript disabled unless necessary
- Cryptography: Use Android Keystore for sensitive operations
- Permissions: Request minimum necessary permissions
- Data Storage: Use EncryptedSharedPreferences for sensitive data
- Network Security: Verify no unauthorized network calls
- Dependencies: Check for known vulnerabilities
// β
Good
fun processUserInput(input: String): Result {
require(input.isNotBlank()) { "Input cannot be blank" }
require(input.length <= MAX_LENGTH) { "Input too long" }
return sanitizeAndProcess(input)
}
// β Bad
fun processUserInput(input: String) = process(input)// β
Good - Use EncryptedSharedPreferences
val sharedPreferences = EncryptedSharedPreferences.create(
context,
"secure_prefs",
masterKey,
EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM
)
// β Bad - Plain SharedPreferences for sensitive data
val sharedPreferences = context.getSharedPreferences("prefs", Context.MODE_PRIVATE)// β
Good - Parameterized query
@Query("SELECT * FROM messages WHERE id = :messageId")
fun getMessageById(messageId: Long): Message?
// β Bad - String concatenation
val query = "SELECT * FROM messages WHERE id = $messageId" // SQL injection riskBefore adding dependencies:
# Check for known vulnerabilities
./gradlew dependencyCheckAnalyze
# Update dependencies regularly
./gradlew dependencyUpdatesRun security-focused static analysis:
# Detekt with security rules
./gradlew detekt
# Android Lint
./gradlew lint- ProGuard/R8: Code obfuscation enabled in release builds
- Certificate Pinning: N/A (no network calls)
- Root Detection: Implemented for sensitive operations
- Debugger Detection: Checks for debugging in release builds
- Tamper Detection: Signature verification
- Secure Random: Using SecureRandom for cryptographic operations
- Memory Clearing: Sensitive data cleared after use
| Permission | Purpose | Justification |
|---|---|---|
RECORD_AUDIO |
Voice input | For voice-based interaction (optional) |
READ_EXTERNAL_STORAGE |
Access documents | For RAG/knowledge base (optional) |
CAMERA |
Image input | For multimodal input (optional) |
All permissions are:
- Requested at runtime
- Require explicit user consent
- Can be revoked at any time
- Not required for core functionality
- Weekly: Dependency vulnerability scans
- Monthly: Security-focused code reviews
- Quarterly: Penetration testing
- Annually: Third-party security audit (planned)
# Run all security checks
./gradlew clean assembleRelease lint detekt test
# Check dependencies
./gradlew dependencyCheckAnalyze
# Verify ProGuard rules
./gradlew assembleRelease
apktool d app/build/outputs/apk/release/app-release.apk- Local Attack Vector: If device is compromised, app data may be accessible
- Side-Channel Attacks: Potential timing attacks on AI inference
- Physical Access: Device with screen unlocked can access app data
- Rooted Devices: Limited protection on rooted devices
- Encourage device encryption
- Implement app-level screen lock
- Clear sensitive data from memory
- Use Android Keystore for cryptographic keys
- Detect and warn on rooted devices
We follow responsible disclosure practices:
- Private Reporting: Vulnerabilities reported privately
- Fix Development: Security team develops and tests fix
- User Notification: Users notified of security updates
- Public Disclosure: After fix is released and users have updated
- Credit: Reporter credited (if desired) in security advisory
- Critical: 7 days after fix release
- High: 14 days after fix release
- Medium: 30 days after fix release
- Low: 60 days after fix release
We recognize security researchers who help improve iris_android:
- To be added as vulnerabilities are responsibly disclosed
For security-related questions or concerns:
- Security Advisories: GitHub Security Tab
- General Security Questions: Create a discussion in the Security category
- Non-Security Bugs: Use standard issue templates
This security policy is licensed under CC BY 4.0.
Last Updated: November 2025
Version: 1.0
This policy may be updated as the project evolves. Check back regularly for updates.