Articulate Storyline 360
Articulate Global Inc.
Why This Matters
If you're a teacher, trainer, or instructional designer using Articulate Storyline, here's what you should know: the application disables HTTPS security checks entirely — meaning anyone on your network (coffee shop, school, hotel) can silently read everything the app sends and receives. Your login credentials, your course content, your students' quiz scores. On top of that, the encryption protecting your LRS passwords uses the same secret key on every computer in the world. If someone gets one encrypted password file, they can decrypt all of them. And there's no privacy policy anywhere in the app telling you any of this is happening.
Articulate Storyline 360 is a desktop eLearning authoring tool used by approximately 120,000 customers worldwide. Our binary analysis of 83 .NET assemblies reveals significant privacy concerns: the application globally bypasses SSL/TLS certificate validation (returning true for all certificates), enabling man-in-the-middle interception of all HTTPS traffic. Analytics data is sent to Raygun and Gainsight using hardcoded API keys with no user consent mechanism found in the code. A universal PBKDF2 salt hardcoded across all installations means LRS (Learning Record Store) credentials — which protect learner PII including names, scores, and completion records — are decryptable by anyone with access to the encrypted file. OAuth refresh tokens are exposed to embedded JavaScript via the CefSharp browser, and the AI panel can be redirected via a registry key to exfiltrate all course content, quiz answers, and authentication tokens. No in-application privacy policy or data collection disclosure was found.
Grade Breakdown
Weighted score: 28/100No consent mechanism found for analytics (Gainsight) or error reporting (Raygun). No opt-in dialog, no opt-out toggle, no settings panel for data collection. Both services collect data automatically during normal use. Zero evidence of GDPR-compliant consent flow in 83 decompiled assemblies.
WMI system enumeration collects hardware details. Error reports include stack traces with file paths and usernames. Gainsight tracks engagement patterns. AI panel exposes full course content and quiz answers via JavaScript API. However, no hardware serial number fingerprinting or SMBIOS-level collection was found.
No in-application privacy policy. No data collection disclosure. No notification about analytics or error reporting. Users have no visibility into what data is collected or where it is sent. Five hardcoded Raygun API keys and two Gainsight keys are completely invisible to users.
SSL/TLS certificate validation is globally bypassed (returns true for all certificates), making every HTTPS connection vulnerable to man-in-the-middle. Universal PBKDF2 salt enables mass decryption of LRS credentials. Hardcoded DPAPI entropy negates Windows credential protection. OAuth refresh tokens exposed to JavaScript. HTTP downgrade for schemaless URLs.
Cannot fully assess policy adherence when no in-app policy exists. Cross-border data transfers to US services without visible Standard Contractual Clauses. EU content endpoints exist but analytics/error reporting still routes to US. No data retention or deletion mechanism found. No DPIA evidence.
Findings
Pre-Consent Collection
Analytics and error reporting collected without user consent mechanism
art-pc-001No user consent dialog, opt-in mechanism, or opt-out toggle was found anywhere in the decompiled codebase for Raygun error reporting or Gainsight engagement analytics. Both services receive data automatically during normal application use. Error reports include stack traces with file paths and system information. Gainsight tracks user engagement patterns and feature usage. This constitutes data processing without demonstrable legal basis under GDPR Article 6.
RaygunClientWrapper.cs:33 — endpoint https://errors.articulate.com/entries. CustomerEngagementApiKeyProvider.cs:20-23 — Gainsight endpoint https://gainsight.articulate.com. No consent UI found in any of 83 decompiled assemblies. No settings toggle for analytics opt-out.
Analytics & Third-Party
Hardcoded Gainsight engagement analytics keys track user behavior
art-an-001Two Gainsight PX API keys are hardcoded for stage and production environments. Gainsight PX is a product analytics platform that tracks feature usage, user engagement patterns, and behavioral data. This data is transmitted to Articulate's Gainsight instance during normal application use without visible user consent.
Tracking & Identifiers
WMI queries collect system hardware and software information
art-tr-001The application executes Windows Management Instrumentation queries to gather system information including CPU model, RAM capacity, GPU details, disk configuration, and OS version. This data is included in analytics payloads sent to Articulate services. While common for compatibility diagnostics, the collection occurs without explicit user notice.
Articulate\Analytics\Platform.cs:24-26 — WMI query execution for system enumeration. Collected data includes processor, memory, display adapter, and operating system details.
OAuth refresh tokens exposed to embedded JavaScript via CefSharp
art-tr-002The application's embedded Chromium browser (CefSharp) exposes full OAuth refresh tokens to JavaScript through host binding methods. Any JavaScript executing in the embedded browser — including redirected AI panel content — can call window.host.GetAuthenticationData() or window.host.GetAuthenticationObject() to retrieve the full refresh token. A refresh token enables persistent account access without re-authentication.
Telemetry
Five hardcoded Raygun API keys for error reporting across environments
art-tl-001Five Raygun API keys are embedded in the binary for Beta, Canary, Dev, Local, and Stable environments. Error reports sent to Raygun include crash data, stack traces containing file paths and usernames, system configuration, and application state. These keys can be extracted by anyone with access to the binary and used to inject false reports or access the Raygun dashboard.
AI panel registry redirect enables full course content and credential exfiltration
art-tl-002The AI assistant panel URL is configurable via a Windows registry key (aiUrl). By setting this key to an attacker-controlled server, all JavaScript host API calls are redirected. The attacker's page can then call host.GetProjectInputs() for all course content, host.GetSelectedQuestionData() for quiz answers including correct answers, and host.GetAuthenticationData() for OAuth tokens. This enables silent exfiltration of intellectual property and credentials.
Course content logged to disk without user notice during AI operations
art-tl-003When the AI writing assistant is used, HTML content is logged before and after processing. These logs may contain sensitive course material, proprietary training content, or personally identifiable information embedded in eLearning courses. Log files are written to the local filesystem without user notification.
Articulate.Storyline.Core\Ai\Writer\View\AiWriterWindow.xaml.cs:138 — HTML content logged pre- and post-escaping. No log rotation or secure deletion observed.
Network Endpoints
SSL/TLS certificate validation globally bypassed — all HTTPS traffic interceptable
art-nw-001The application sets a global ServicePointManager callback that accepts ALL certificates without validation, including expired, self-signed, and revoked certificates. This affects every HTTPS connection made by the application — OAuth authentication, analytics, error reporting, content downloads, and AI service calls. Any network attacker can intercept, read, and modify all traffic via a trivial man-in-the-middle attack.
Articulate.Design\SlideView.cs:753-755 — ValidateServerCertificate() returns true unconditionally. This is set on ServicePointManager.ServerCertificateValidationCallback, which is process-global. Affects all HttpWebRequest, HttpClient, and WebClient connections.
HTTP protocol downgrade for URLs without explicit scheme
art-nw-002When a URL does not include a protocol scheme, the application defaults to insecure HTTP rather than HTTPS. This affects any user-provided or configuration-specified URL including LRS endpoints, content sources, and external resource links. Combined with the SSL certificate validation bypass, this creates a complete absence of transport security.
Articulate\Internal\UrlHelper.cs:24-26 — if (!text.StartsWith("http://") && !text.StartsWith("https://")) { text = "http://" + text; }
GDPR / Privacy Regulation
Universal PBKDF2 salt enables mass decryption of LRS credentials worldwide
art-gd-001A single 13-byte PBKDF2 salt is hardcoded in the Cryptor class and used across ALL installations globally. This salt protects LRS (Learning Record Store) passwords, character asset encryption, published content DRM, and cache encryption. Because the salt is identical everywhere, an attacker can build a rainbow table once and decrypt LRS credentials from any .story file or published course. LRS credentials provide access to learner records containing PII: names, email addresses, scores, and completion data.
Hardcoded DPAPI entropy negates Windows credential protection
art-gd-002The Windows Data Protection API entropy value is hardcoded as a static string across all installations. DPAPI entropy is intended to be a per-application or per-installation secret that prevents other applications running as the same user from decrypting protected data. Hardcoding it means any application with access to this string can decrypt Storyline's protected credentials, including proxy server passwords and saved registry credentials.
Cross-border data transfers to US services without visible safeguards
art-gd-003User data is transmitted to multiple US-hosted services: errors.articulate.com (Raygun), gainsight.articulate.com (analytics), and id.articulate.com (Okta authentication). For EU customers, GDPR Articles 44-49 require Standard Contractual Clauses or adequacy decisions for transfers outside the EEA. No evidence of such safeguards was found in the application code or documentation.
Three US-hosted endpoints confirmed: errors.articulate.com, gainsight.articulate.com, id.articulate.com (Okta). EU region endpoints exist (storyline-components.eu.articulate.com) but analytics and error reporting still route to US endpoints.
Policy Adherence
No in-application privacy policy or data collection disclosure
art-pa-001Across all 83 decompiled assemblies, no privacy policy, data collection notice, or terms of service was found embedded in the application. Users receive no notification within the application about what data is collected, where it is sent, or how to opt out. GDPR Article 13 requires that data subjects be informed at the time of collection.
Full-text search across 83 assemblies for 'privacy policy', 'data collection', 'opt out', 'consent', 'GDPR' returned zero results in UI-facing code. No dialog or notification class references privacy disclosure.
+Positive Findings
EU-specific service endpoints for European customers
art-po-001Articulate provides EU-region endpoints for content services (storyline-components.eu.articulate.com), indicating awareness of data residency requirements. This is a positive step, though analytics and error reporting still route through US endpoints.
Region-specific URLs: US=https://storyline-components.articulate.com/, EU=https://storyline-components.eu.articulate.com/. Configuration selects region based on subscription.
Methodology
Static analysis via JetBrains dotPeek and ILSpy decompilation of 83 .NET assemblies from the Storyline x64 installation directory. 14 of 83 assemblies recompile successfully for code path verification. Full string extraction and API surface mapping across all assemblies. CefSharp JavaScript binding API documented (1,198 lines). Registry key analysis for configuration overrides. Cryptographic implementation review of Cryptor.cs and ProtectData.cs. No dynamic analysis performed for this report.
Compare with other software
See how this product's data practices compare side-by-side.
View Comparison