Skip to content

Commit 45b86be

Browse files
authored
fix(amazonq): escaping user input to mitigate xss issue (#2360)
* fix(amazonq): escaping user input to mitigate xss issue * fix: adding conditional check for applying sanitizeinput
1 parent d56bfa1 commit 45b86be

File tree

7 files changed

+9
-16
lines changed

7 files changed

+9
-16
lines changed

package-lock.json

Lines changed: 0 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

server/aws-lsp-codewhisperer/package.json

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,8 +67,7 @@
6767
"vscode-uri": "^3.1.0",
6868
"ws": "^8.18.0",
6969
"xml2js": "^0.6.2",
70-
"xmlbuilder2": "^3.1.1",
71-
"unescape-html": "^1.1.0"
70+
"xmlbuilder2": "^3.1.1"
7271
},
7372
"devDependencies": {
7473
"@types/adm-zip": "^0.5.5",

server/aws-lsp-codewhisperer/src/language-server/agenticChat/agenticChatController.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -231,7 +231,6 @@ import { CodeWhispererServiceToken } from '../../shared/codeWhispererService'
231231
import { DisplayFindings } from './tools/qCodeAnalysis/displayFindings'
232232
import { IDE } from '../../shared/constants'
233233
import { IdleWorkspaceManager } from '../workspaceContext/IdleWorkspaceManager'
234-
import escapeHTML = require('escape-html')
235234
import { SemanticSearch } from './tools/workspaceContext/semanticSearch'
236235
import { MemoryBankController } from './context/memorybank/memoryBankController'
237236

@@ -834,7 +833,7 @@ export class AgenticChatController implements ChatHandlers {
834833

835834
async onChatPrompt(params: ChatParams, token: CancellationToken): Promise<ChatResult | ResponseError<ChatResult>> {
836835
// Phase 1: Initial Setup - This happens only once
837-
params.prompt.prompt = sanitizeInput(params.prompt.prompt || '')
836+
params.prompt.prompt = sanitizeInput(params.prompt.prompt || '', true)
838837

839838
IdleWorkspaceManager.recordActivityTimestamp()
840839

@@ -1451,7 +1450,7 @@ export class AgenticChatController implements ChatHandlers {
14511450
this.#debug('Skipping adding user message to history - cancelled by user')
14521451
} else {
14531452
this.#chatHistoryDb.addMessage(tabId, 'cwc', conversationIdentifier, {
1454-
body: escapeHTML(currentMessage.userInputMessage?.content ?? ''),
1453+
body: currentMessage.userInputMessage?.content ?? '',
14551454
type: 'prompt' as any,
14561455
userIntent: currentMessage.userInputMessage?.userIntent,
14571456
origin: currentMessage.userInputMessage?.origin,

server/aws-lsp-codewhisperer/src/language-server/agenticChat/tools/chatDb/chatDb.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@ import { ChatItemType } from '@aws/mynah-ui'
3535
import { getUserHomeDir } from '@aws/lsp-core/out/util/path'
3636
import { ChatHistoryMaintainer } from './chatHistoryMaintainer'
3737
import { existsSync, renameSync } from 'fs'
38-
import escapeHTML = require('escape-html')
3938

4039
export class ToolResultValidationError extends Error {
4140
constructor(message?: string) {
@@ -689,7 +688,6 @@ export class ChatDatabase {
689688
}
690689
return {
691690
...message,
692-
body: escapeHTML(message.body),
693691
userInputMessageContext: {
694692
// keep falcon context when inputMessage is not a toolResult message
695693
editorState: hasToolResults ? undefined : message.userInputMessageContext?.editorState,

server/aws-lsp-codewhisperer/src/language-server/agenticChat/tools/chatDb/util.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@ import { activeFileCmd } from '../../context/additionalContextProvider'
2828
import { PriorityQueue } from 'typescript-collections'
2929
import { Features } from '@aws/language-server-runtimes/server-interface/server'
3030
import * as crypto from 'crypto'
31-
import unescapeHTML = require('unescape-html')
3231

3332
// Ported from https://github.com/aws/aws-toolkit-vscode/blob/master/packages/core/src/shared/db/chatDb/util.ts
3433

@@ -173,7 +172,7 @@ export function messageToStreamingMessage(msg: Message): StreamingMessage {
173172
export function messageToChatMessage(msg: Message): ChatMessage[] {
174173
const chatMessages: ChatMessage[] = [
175174
{
176-
body: unescapeHTML(msg.body),
175+
body: msg.body,
177176
type: msg.type,
178177
codeReference: msg.codeReference,
179178
relatedContent:

server/aws-lsp-codewhisperer/src/shared/utils.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,9 @@ import { ServiceException } from '@smithy/smithy-client'
2929
import { promises as fs } from 'fs'
3030
import * as fg from 'fast-glob'
3131
import { getAuthFollowUpType } from '../language-server/chat/utils'
32-
import ignore = require('ignore')
3332
import { InitializeParams } from '@aws/language-server-runtimes/server-interface'
3433
import { QClientCapabilities } from '../language-server/configuration/qConfigurationServer'
34+
import escapeHTML = require('escape-html')
3535

3636
export function isAwsError(error: unknown): error is AWSError {
3737
if (error === undefined) {
@@ -610,10 +610,13 @@ export function getFileExtensionName(filepath: string): string {
610610
* @param input The input string to sanitize
611611
* @returns The sanitized string with dangerous characters removed
612612
*/
613-
export function sanitizeInput(input: string): string {
613+
export function sanitizeInput(input: string, enableEscapingHTML: boolean = false): string {
614614
if (!input) {
615615
return input
616616
}
617+
if (enableEscapingHTML) {
618+
input = escapeHTML(input)
619+
}
617620

618621
// Remove Unicode tag characters (U+E0000-U+E007F) used in ASCII smuggling
619622
// Remove other invisible/control characters that could hide content

server/aws-lsp-codewhisperer/src/types/unescape.d.ts

Lines changed: 0 additions & 4 deletions
This file was deleted.

0 commit comments

Comments
 (0)