Privacy Tools Guide

Stop screen sharing immediately using platform shortcuts (Cmd+Shift+E in Zoom, Ctrl+Shift+E in Teams), notify participants that sensitive data was exposed, and rotate any credentials visible (API keys, passwords, tokens). If recording was active, check whether the sensitive content was captured and edit the recording to remove compromised segments. Most platforms allow 15-30 minutes before recordings are finalized; act quickly. For code repositories, API keys, or database credentials exposed, treat as immediate security incidents: revoke credentials, reset passwords, audit access logs, and deploy updated keys to production systems.

Immediate Actions: The First 60 Seconds

When you realize sensitive information is visible to others, act immediately. The goal is to minimize exposure time and prevent recording or caching of the content.

Stop the sharing session immediately. Most platforms allow you to end sharing with a keyboard shortcut or click. In Zoom, press Cmd+Shift+E (Mac) or Alt+Q (Windows) to stop sharing. In Microsoft Teams, press Ctrl+Shift+E to end the call. Discord users can click the “Stop Sharing” button or use the slash command /disconnect.

Notify participants. Say something like “I just noticed sensitive information on my screen—please disregard what you saw for the past few seconds.” This creates a record that you recognized the issue and takes responsibility.

If recording was active, check whether the sensitive content was captured. Most platforms label recordings clearly. If your organization’s compliance requirements demand it, you may need to delete or edit the recording. Many video conferencing tools allow you to trim recordings to remove compromised segments.

Platform-Specific Recovery Steps

Different platforms handle screen sharing differently. Understanding these differences helps you assess the actual risk.

Zoom

Zoom recordings are typically saved to the host’s local machine or cloud storage, depending on your settings. After ending the call:

  1. Check your recording location (Settings > Recording > Local Recording or Cloud Recording)
  2. If cloud recordings exist, sign in to the Zoom web portal and delete or trim the affected segment
  3. For local recordings, open the file and either delete it or use video editing software to remove the sensitive portion
  4. Review Zoom’s “Recording Management” page to ensure no accidental copies remain

Microsoft Teams

Teams stores meeting recordings in OneDrive or SharePoint, depending on your organization’s configuration. Navigate to the meeting chat after the call, locate the recording, and delete it. If you’re an administrator, you can also use the Teams admin center to manage recordings across the organization.

Google Meet

Google Meet recordings save directly to the meeting organizer’s Google Drive. Access the meeting recording through the calendar event or the Drive folder associated with the meeting. Delete the file and empty the Trash to ensure complete removal.

Discord

Discord screen share sessions are not recorded by default. However, if someone was using third-party recording software, you cannot control that. Focus on what you can control: end your stream immediately and ask participants not to distribute any screenshots they may have taken.

Assessing the Actual Risk

Not all screen shares carry the same risk level. Evaluate your situation based on several factors.

Duration of exposure matters. A five-second glance at a terminal window is far less risky than a five-minute discussion with sensitive data visible. Calculate roughly how long the information was on screen.

Audience scope determines who potentially saw the content. Internal team members with signed NDAs present less risk than external participants or recorded sessions that may be distributed later.

Type of data drives your response urgency. Exposed API keys or database credentials require immediate rotation. A visible email address warrants monitoring for phishing, but rotation isn’t necessary.

For developers, here’s a quick risk assessment framework:

# Quick severity assessment
case "$EXPOSURE_TYPE" in
 "api_key"|"secret_token"|"password")
 SEVERITY="critical"
 ACTION="rotate immediately"
 ;;
 "email"|"username"|"non-sensitive-config")
 SEVERITY="low"
 ACTION="monitor for anomalies"
 ;;
 "customer_data"|"pii")
 SEVERITY="high"
 ACTION="report to security team"
 ;;
esac

echo "Severity: $SEVERITY - Action: $ACTION"

Technical Containment for Developers

If you exposed secrets in a terminal or code editor during screen sharing, additional steps may be necessary.

Check your terminal scrollback. Terminal emulators often retain scrollback history. An attacker with access to your machine (or forensic analysis later) could retrieve previously displayed content. Clear your terminal history:

# Clear terminal scrollback (works in most terminals)
printf '\033[3J'

# Or use the clear command with history preservation
clear

# For specific shells, clear history files
# Bash: history -c && history -w
# Zsh: history -p && fc -W
# Fish: history --clear

Review clipboard history. If you copy-pasted the sensitive information shortly before sharing, check whether clipboard managers retained it. On macOS, disable clipboard history temporarily:

# Disable macOS clipboard history (requires macOS 10.14+)
defaults write com.apple.finder ShowRecentFiles 0

Check log files. Your terminal may have written the displayed commands to shell history or log files. Review .bash_history, .zsh_history, or similar files to ensure no secrets are stored there.

# Search history for potential leaks (GitHub token pattern example)
grep -E "ghp_[a-zA-Z0-9]{36}|github_pat_[a-zA-Z0-9_]{22,}" ~/.bash_history ~/.zsh_history 2>/dev/null

# If found, delete the compromised lines
history -d $(grep -n "your-secret-pattern" ~/.bash_history | cut -d: -f1)

Preventing Future Accidents

Prevention is more effective than reaction. Implement these strategies to reduce the risk of accidental screen exposure.

Use dedicated non-sensitive terminals. Keep a “presentation terminal” profile that shows only sanitized content. Create a terminal profile with minimal environment variables and no secrets loaded.

# Create a clean shell profile for presentations
# Add to ~/.bashrc or ~/.zshrc
if [ "$PRESENTATION_MODE" = "1" ]; then
 export PS1="\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]$ "
 unset API_KEY AWS_SECRET GITHUB_TOKEN
 # Load only safe-to-show configs
 source ~/.safe-env
fi

Enable notifications for sensitive windows. On macOS, use Keyboard Maestro or Hammerspoon to trigger alerts when windows containing specific keywords (like “API”, “secret”, “password”) come into focus.

-- Hammerspoon example: alert when sensitive windows activate
hs.window.filter.new()
 :subscribe(hs.window.filter.windowFocused, function(window, app)
 local title = window:title()
 if title:match("API") or title:match("secret") or title:match("password") then
 hs.alert.show("⚠️ Sensitive window focused - check your screen share!", 3)
 end
 end)

Configure your IDE to hide sensitive content. Many IDEs offer features to obscure sensitive values in the editor. VS Code extensions like “Hide Secrets” replace displayed values with asterisks while keeping the actual content in memory.

Use the “pause sharing” feature strategically. Most platforms let you pause sharing without ending the entire session. When switching applications or screens, pause first, then resume once you’ve confirmed no sensitive content is visible.

When to Escalate

Sometimes the exposure requires formal incident response. Escalate to your security team if:

Provide your security team with details: what was exposed, for how long, who was present, and whether recordings exist. This enables them to take appropriate countermeasures, such as rotating compromised credentials or notifying affected parties.

Forensic Analysis of Screen Share Exposure

For security teams investigating potential data leaks from screen sharing incidents:

Timeline Reconstruction

# Incident forensics: Determine what was actually exposed

class ScreenShareIncidentAnalysis:
 def __init__(self, meeting_platform, incident_report):
 self.platform = meeting_platform
 self.report = incident_report

 def determine_actual_exposure(self):
 """
 Reconstruct what participants could have observed
 Accounts for: video resolution, screen position, timing
 """
 exposure_factors = {
 'resolution_quality': 'HD (1080p) = clearer text',
 'text_size': 'font_size_px >= 16 is readable',
 'duration': f'{self.report["duration"]} seconds',
 'distance': 'Assume optimal viewing distance',
 'participant_attention': 'Assume viewing entire screen'
 }

 # Calculate what was realistically observable
 observable_lines_of_code = self.calculate_visible_lines()
 observable_text = self.estimate_readable_text()

 return {
 'conservative_estimate': observable_text,
 'worst_case_estimate': self.report.get('screen_content'),
 'factors': exposure_factors
 }

 def calculate_visible_lines(self):
 """How many lines of terminal/code were visible?"""
 screen_height = 1080
 line_height = 25 # pixels per line at readable size
 visible_lines = screen_height / line_height
 return int(visible_lines) # ~43 lines visible

 def estimate_readable_text(self):
 """What text was actually readable?"""
 dpi = 96
 font_size = 12 # At < 12pt, difficult to read on video
 readable_threshold = 16 # pt

 if font_size < readable_threshold:
 return "Text likely unreadable in video stream"
 else:
 return "Text was likely readable"

Credential Exposure Classification

# Severity classification for different credential types

# CRITICAL - Rotate immediately
CRITICAL_CREDENTIALS=(
 "AWS_SECRET_ACCESS_KEY"
 "PRIVATE_SSH_KEY"
 "DATABASE_PASSWORD"
 "API_KEY_SECRET"
 "ENCRYPTION_KEY"
 "JWT_SIGNING_KEY"
 "GPG_PRIVATE_KEY"
)

# HIGH - Rotate within 24 hours
HIGH_CREDENTIALS=(
 "GITHUB_TOKEN"
 "SLACK_TOKEN"
 "DOCKER_HUB_TOKEN"
 "STRIPE_API_KEY"
)

# MEDIUM - Rotate within 7 days
MEDIUM_CREDENTIALS=(
 "PUBLIC_API_KEY"
 "STAGING_DATABASE_PASSWORD"
 "SERVICE_ACCOUNT_EMAIL"
)

# LOW - Monitor but no rotation needed
LOW_CREDENTIALS=(
 "PUBLIC_GITHUB_USERNAME"
 "WEBSITE_URL"
 "DOCUMENTATION_LINK"
)

# Automated rotation script
for credential in "${CRITICAL_CREDENTIALS[@]}"; do
 rotate_credential "$credential"
 audit_access_logs "$credential"
 notify_security_team "$credential" "CRITICAL"
done

Automated Detection of Sensitive Content

Building Screen Share Safeguards

Organizations can implement automated detection that prevents sensitive content visibility:

// Client-side content detection before screen sharing
class SensitiveContentDetector {
 constructor() {
 this.sensitivePatterns = {
 // API key patterns
 api_key: /^(sk_live_|pk_live_|ghp_)[A-Za-z0-9_]{20,}/gm,
 // AWS credentials
 aws_key: /AKIA[0-9A-Z]{16}/g,
 // Private keys
 private_key: /-----BEGIN (PRIVATE|RSA) KEY-----/g,
 // Database URLs
 database_url: /postgres:\/\/[^:]+:[^@]+@[^/]+/gi,
 // Passwords (common patterns)
 password: /password\s*=\s*['"][^'"]+['"]/gi,
 // Email in code/config
 email: /[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}/g
 };
 }

 async scanScreenBefore Sharing() {
 try {
 // Capture current screen
 const stream = await navigator.mediaDevices.getDisplayMedia({
 video: { frameRate: 1 } // Low FPS for analysis
 });

 const canvas = document.createElement('canvas');
 const ctx = canvas.getContext('2d');
 const video = document.createElement('video');
 video.srcObject = stream;

 video.onloadedmetadata = () => {
 ctx.drawImage(video, 0, 0);
 const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);

 // Use OCR to extract text from screen
 this.analyzeContent(imageData);

 // Stop the stream
 stream.getTracks().forEach(track => track.stop());
 };
 } catch (err) {
 console.error('Screen capture failed:', err);
 }
 }

 analyzeContent(imageData) {
 // Use Tesseract.js for OCR
 Tesseract.recognize(imageData, 'eng')
 .then(result => {
 const text = result.data.text;
 this.checkForSensitivePatterns(text);
 });
 }

 checkForSensitivePatterns(text) {
 const findings = [];

 for (const [type, pattern] of Object.entries(this.sensitivePatterns)) {
 const matches = text.match(pattern);
 if (matches && matches.length > 0) {
 findings.push({
 type: type,
 count: matches.length,
 severity: this.calculateSeverity(type)
 });
 }
 }

 if (findings.length > 0) {
 this.warnUser(findings);
 return false; // Block screen sharing
 }

 return true; // Safe to share
 }

 calculateSeverity(contentType) {
 const severities = {
 'private_key': 'CRITICAL',
 'aws_key': 'CRITICAL',
 'api_key': 'CRITICAL',
 'password': 'HIGH',
 'database_url': 'HIGH',
 'email': 'MEDIUM'
 };
 return severities[contentType] || 'LOW';
 }

 warnUser(findings) {
 const message = findings
 .map(f => `⚠️ DETECTED: ${f.type} (${f.count} matches) - ${f.severity}`)
 .join('\n');

 alert(`Do not share screen!\n\n${message}\n\nClose sensitive windows first.`);
 }
}

Platform-Specific Recording Protection

Zoom Recording Security Measures

# Advanced Zoom security configuration to prevent accidental exposure

# Disable local recording (force cloud recording with controls)
defaults write com.zoom.xos ZoomEnableLocalRecording -bool false

# Disable screen sharing of specific windows
# (can whitelist only safe applications)
defaults write com.zoom.xos ZoomScreenShareApplicationsAllowlist -array \
 "com.apple.Safari" \
 "com.google.Chrome"

# Require authentication to join meetings
defaults write com.zoom.xos ZoomRequireAuthToJoin -bool true

# Automatically mute when screen share starts
defaults write com.zoom.xos ZoomAutoMuteOnScreenShare -bool true

Teams Meeting Recording Recovery

# PowerShell script to find and audit Teams recordings

function Find-TeamsRecordings {
 param(
 [string]$outputPath = "$env:USERPROFILE\Teams Recordings"
 )

 # Teams stores recordings in OneDrive and SharePoint
 $teamsRecordings = @(
 "$env:OneDriveConsumer\Teams Recordings",
 "$env:OneDrive\Teams Recordings"
 )

 foreach ($folder in $teamsRecordings) {
 if (Test-Path $folder) {
 Get-ChildItem -Path $folder -Include "*.mp4" |
 Select-Object Name, @{N='Size (MB)';E={[math]::Round($_.Length/1MB,2)}}, CreationTime |
 Export-Csv "$outputPath\TeamsRecordings.csv" -NoTypeInformation
 }
 }
}

# Find recordings to audit or delete
Find-TeamsRecordings

Built by theluckystrike — More at zovo.one