Articulate Storyline 360

Articulate Global Inc.

Version: 6.92.33293.0Binary: Storyline.exe + 83 .NET assembliesAnalyzed: 2026-02-11
F28/100

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.

14
Findings
5
critical
5
high
3
medium
0
low

Grade Breakdown

Weighted score: 28/100
Consent20/100 (25%)

No 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.

Data Minimization35/100 (20%)

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.

Transparency20/100 (20%)

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.

Security15/100 (15%)

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.

Policy Adherence30/100 (20%)

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

Analytics & Third-Party

high

Hardcoded Gainsight engagement analytics keys track user behavior

art-an-001

Two 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.

Full evidence available at researcher tier — sign in

Tracking & Identifiers

medium

WMI queries collect system hardware and software information

art-tr-001

The 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.

Evidence

Articulate\Analytics\Platform.cs:24-26 — WMI query execution for system enumeration. Collected data includes processor, memory, display adapter, and operating system details.

critical

OAuth refresh tokens exposed to embedded JavaScript via CefSharp

art-tr-002

The 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.

Full evidence available at researcher tier — sign in

Telemetry

high

Five hardcoded Raygun API keys for error reporting across environments

art-tl-001

Five 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.

Full evidence available at researcher tier — sign in
critical

AI panel registry redirect enables full course content and credential exfiltration

art-tl-002

The 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.

Full evidence available at researcher tier — sign in
medium

Course content logged to disk without user notice during AI operations

art-tl-003

When 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.

Evidence

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

critical

SSL/TLS certificate validation globally bypassed — all HTTPS traffic interceptable

art-nw-001

The 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.

Evidence

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.

high

HTTP protocol downgrade for URLs without explicit scheme

art-nw-002

When 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.

Evidence

Articulate\Internal\UrlHelper.cs:24-26 — if (!text.StartsWith("http://") && !text.StartsWith("https://")) { text = "http://" + text; }

GDPR / Privacy Regulation

critical

Universal PBKDF2 salt enables mass decryption of LRS credentials worldwide

art-gd-001

A 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.

Full evidence available at researcher tier — sign in
high

Hardcoded DPAPI entropy negates Windows credential protection

art-gd-002

The 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.

Full evidence available at researcher tier — sign in
medium

Cross-border data transfers to US services without visible safeguards

art-gd-003

User 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.

Evidence

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

high

No in-application privacy policy or data collection disclosure

art-pa-001

Across 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.

Evidence

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

info

EU-specific service endpoints for European customers

art-po-001

Articulate 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.

Evidence

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