summaryrefslogtreecommitdiff
path: root/packages/backend
diff options
context:
space:
mode:
authorAcid Chicken (硫酸鶏) <root@acid-chicken.com>2023-12-03 14:38:42 +0900
committerGitHub <noreply@github.com>2023-12-03 14:38:42 +0900
commitaf15f8d09db6c1709950bf9d00ffb77613fbcf8a (patch)
tree2759dec33d638ae4a6a3d17da7ba53d83270a2b6 /packages/backend
parentfix(backend): enhance nodeinfo by export instance admin via nodeAdmins key (#... (diff)
downloadsharkey-af15f8d09db6c1709950bf9d00ffb77613fbcf8a.tar.gz
sharkey-af15f8d09db6c1709950bf9d00ffb77613fbcf8a.tar.bz2
sharkey-af15f8d09db6c1709950bf9d00ffb77613fbcf8a.zip
fix(backend): reject malformed timestamp (#12554)
Diffstat (limited to 'packages/backend')
-rw-r--r--packages/backend/src/core/IdService.ts23
-rw-r--r--packages/backend/src/core/activitypub/ApInboxService.ts8
-rw-r--r--packages/backend/src/core/activitypub/models/ApNoteService.ts4
-rw-r--r--packages/backend/src/misc/id/aid.ts4
-rw-r--r--packages/backend/src/misc/id/aidx.ts4
-rw-r--r--packages/backend/src/misc/id/meid.ts4
-rw-r--r--packages/backend/src/misc/id/meidg.ts4
-rw-r--r--packages/backend/src/misc/id/object-id.ts4
8 files changed, 49 insertions, 6 deletions
diff --git a/packages/backend/src/core/IdService.ts b/packages/backend/src/core/IdService.ts
index c98b8ea6fc..43e72d2d7b 100644
--- a/packages/backend/src/core/IdService.ts
+++ b/packages/backend/src/core/IdService.ts
@@ -7,11 +7,11 @@ import { Inject, Injectable } from '@nestjs/common';
import { ulid } from 'ulid';
import { DI } from '@/di-symbols.js';
import type { Config } from '@/config.js';
-import { genAid, parseAid } from '@/misc/id/aid.js';
-import { genAidx, parseAidx } from '@/misc/id/aidx.js';
-import { genMeid, parseMeid } from '@/misc/id/meid.js';
-import { genMeidg, parseMeidg } from '@/misc/id/meidg.js';
-import { genObjectId, parseObjectId } from '@/misc/id/object-id.js';
+import { genAid, isSafeAidT, parseAid } from '@/misc/id/aid.js';
+import { genAidx, isSafeAidxT, parseAidx } from '@/misc/id/aidx.js';
+import { genMeid, isSafeMeidT, parseMeid } from '@/misc/id/meid.js';
+import { genMeidg, isSafeMeidgT, parseMeidg } from '@/misc/id/meidg.js';
+import { genObjectId, isSafeObjectIdT, parseObjectId } from '@/misc/id/object-id.js';
import { bindThis } from '@/decorators.js';
import { parseUlid } from '@/misc/id/ulid.js';
@@ -26,6 +26,19 @@ export class IdService {
this.method = config.id.toLowerCase();
}
+ @bindThis
+ public isSafeT(t: number): boolean {
+ switch (this.method) {
+ case 'aid': return isSafeAidT(t);
+ case 'aidx': return isSafeAidxT(t);
+ case 'meid': return isSafeMeidT(t);
+ case 'meidg': return isSafeMeidgT(t);
+ case 'ulid': return t > 0;
+ case 'objectid': return isSafeObjectIdT(t);
+ default: throw new Error('unrecognized id generation method');
+ }
+ }
+
/**
* 時間を元にIDを生成します(省略時は現在日時)
* @param time 日時
diff --git a/packages/backend/src/core/activitypub/ApInboxService.ts b/packages/backend/src/core/activitypub/ApInboxService.ts
index 7aba140689..baaab67e48 100644
--- a/packages/backend/src/core/activitypub/ApInboxService.ts
+++ b/packages/backend/src/core/activitypub/ApInboxService.ts
@@ -306,9 +306,15 @@ export class ApInboxService {
this.logger.info(`Creating the (Re)Note: ${uri}`);
const activityAudience = await this.apAudienceService.parseAudience(actor, activity.to, activity.cc);
+ const createdAt = activity.published ? new Date(activity.published) : null;
+
+ if (createdAt && createdAt < this.idService.parse(renote.id).date) {
+ this.logger.warn('skip: malformed createdAt');
+ return;
+ }
await this.noteCreateService.create(actor, {
- createdAt: activity.published ? new Date(activity.published) : null,
+ createdAt,
renote,
visibility: activityAudience.visibility,
visibleUsers: activityAudience.visibleUsers,
diff --git a/packages/backend/src/core/activitypub/models/ApNoteService.ts b/packages/backend/src/core/activitypub/models/ApNoteService.ts
index 1979cdda9c..05d5ca15db 100644
--- a/packages/backend/src/core/activitypub/models/ApNoteService.ts
+++ b/packages/backend/src/core/activitypub/models/ApNoteService.ts
@@ -92,6 +92,10 @@ export class ApNoteService {
return new Error(`invalid Note: attributedTo has different host. expected: ${expectHost}, actual: ${actualHost}`);
}
+ if (object.published && !this.idService.isSafeT(new Date(object.published).valueOf())) {
+ return new Error('invalid Note: published timestamp is malformed');
+ }
+
return null;
}
diff --git a/packages/backend/src/misc/id/aid.ts b/packages/backend/src/misc/id/aid.ts
index e7b59f262b..de03f6793f 100644
--- a/packages/backend/src/misc/id/aid.ts
+++ b/packages/backend/src/misc/id/aid.ts
@@ -34,3 +34,7 @@ export function parseAid(id: string): { date: Date; } {
const time = parseInt(id.slice(0, 8), 36) + TIME2000;
return { date: new Date(time) };
}
+
+export function isSafeAidT(t: number): boolean {
+ return t > TIME2000;
+}
diff --git a/packages/backend/src/misc/id/aidx.ts b/packages/backend/src/misc/id/aidx.ts
index bed223225a..9f457f6f0a 100644
--- a/packages/backend/src/misc/id/aidx.ts
+++ b/packages/backend/src/misc/id/aidx.ts
@@ -41,3 +41,7 @@ export function parseAidx(id: string): { date: Date; } {
const time = parseInt(id.slice(0, TIME_LENGTH), 36) + TIME2000;
return { date: new Date(time) };
}
+
+export function isSafeAidxT(t: number): boolean {
+ return t > TIME2000;
+}
diff --git a/packages/backend/src/misc/id/meid.ts b/packages/backend/src/misc/id/meid.ts
index 366738de05..7646282edb 100644
--- a/packages/backend/src/misc/id/meid.ts
+++ b/packages/backend/src/misc/id/meid.ts
@@ -38,3 +38,7 @@ export function parseMeid(id: string): { date: Date; } {
date: new Date(parseInt(id.slice(0, 12), 16) - 0x800000000000),
};
}
+
+export function isSafeMeidT(t: number): boolean {
+ return t > 0;
+}
diff --git a/packages/backend/src/misc/id/meidg.ts b/packages/backend/src/misc/id/meidg.ts
index 426a46970b..f2a55443ef 100644
--- a/packages/backend/src/misc/id/meidg.ts
+++ b/packages/backend/src/misc/id/meidg.ts
@@ -38,3 +38,7 @@ export function parseMeidg(id: string): { date: Date; } {
date: new Date(parseInt(id.slice(1, 12), 16)),
};
}
+
+export function isSafeMeidgT(t: number): boolean {
+ return t > 0;
+}
diff --git a/packages/backend/src/misc/id/object-id.ts b/packages/backend/src/misc/id/object-id.ts
index 49bd9591c0..f5c3619fdb 100644
--- a/packages/backend/src/misc/id/object-id.ts
+++ b/packages/backend/src/misc/id/object-id.ts
@@ -38,3 +38,7 @@ export function parseObjectId(id: string): { date: Date; } {
date: new Date(parseInt(id.slice(0, 8), 16) * 1000),
};
}
+
+export function isSafeObjectIdT(t: number): boolean {
+ return t > 0;
+}