เพิ่มลงใน Chrome

หลักการทำงาน

ภาพรวมเชิงเทคนิคสำหรับผู้ตรวจสอบความปลอดภัย ทุกอย่างในหน้านี้ตรวจสอบย้อนกลับไปที่ซอร์สโค้ดได้ รวมถึงส่วนที่ไม่เข้าข้างเราเอง ซึ่งเราเลือกจะเขียนไว้แทนที่จะตัดทิ้ง

สถาปัตยกรรม

ไม่มีแบ็กเอนด์ ส่วนขยายนี้เป็นส่วนขยาย Chrome แบบ Manifest V3 ที่สร้างรหัส TOTP/HOTP ในเครื่องด้วย OTPAuth เราไม่ได้ดูแลเซิร์ฟเวอร์ใด ๆ ไม่มีบัญชีผู้ใช้ และไม่มีช่องทางใดที่ข้อมูลของผู้ใช้จะเดินทางมาถึงเราได้

เมื่อไม่มีเซิร์ฟเวอร์ ก็ไม่มีวัสดุกุญแจฝั่งเซิร์ฟเวอร์ ไม่มีการฝากกุญแจ และไม่มีเส้นทางกู้คืนที่เราควบคุม หากผู้ใช้ลืมรหัสผ่านและทำรหัสกู้คืนหาย เราก็ช่วยอะไรไม่ได้ ซึ่งเป็นไปตามที่ออกแบบไว้

การเข้ารหัส

การป้องกันด้วยรหัสผ่านเป็นตัวเลือกเสริมและปิดไว้ตั้งแต่ต้น เมื่อเปิดใช้งาน:

อัลกอริทึม
AES-256-GCM พร้อม IV สุ่มขนาด 96 บิตสำหรับทุกระเบียนและทุกครั้งที่เขียนทับ
การสร้างกุญแจ
PBKDF2-HMAC-SHA256 จำนวน 600,000 รอบ พร้อมซอลต์สุ่มขนาด 128 บิต (ตามคำแนะนำของ OWASP)
กุญแจหลัก
ขนาด 256 บิต จาก crypto.getRandomValues สร้างเพียงครั้งเดียว รหัสผ่านทำหน้าที่แค่ห่อหุ้มมันไว้
ลายนิ้วมือข้อมูล
HMAC-SHA256 ภายใต้กุญแจย่อยที่สร้างด้วย HKDF ใช้สำหรับรวมระเบียนข้ามอุปกรณ์
ที่เก็บกุญแจที่ปลดล็อกแล้ว
chrome.storage.session — อยู่ในหน่วยความจำเท่านั้น ไม่เคยเขียนลงดิสก์ ถูกล้างเมื่อปิดเบราว์เซอร์ และ content script เข้าถึงไม่ได้
ล็อกอัตโนมัติ
ทุกครั้งที่เปิด / หลังไม่ใช้งาน 5, 15 หรือ 60 นาที / จนกว่าจะปิดเบราว์เซอร์
การนำไปใช้
ใช้ WebCrypto เท่านั้น ไม่มีการเขียนพรีมิทิฟเข้ารหัสเองและไม่มีการรวมไลบรารีเข้ารหัสใด ๆ ไว้ในแพ็กเกจ

ทำไมต้องมีกุญแจสองชั้น

ข้อมูลไม่เคยถูกเข้ารหัสด้วยกุญแจที่ได้จากรหัสผ่านโดยตรง ระเบียนต่าง ๆ ถูกเข้ารหัสด้วยกุญแจหลักแบบสุ่ม ส่วนผลลัพธ์จาก PBKDF2 ทำหน้าที่ห่อหุ้มกุญแจหลักนั้นเท่านั้น ผลที่ตามมามีสองข้อ และสำคัญทั้งคู่:

  • การเปลี่ยนรหัสผ่านเขียนข้อมูลใหม่เพียง 32 ไบต์ แทนที่จะต้องเข้ารหัสทุกระเบียน ทุกไฟล์สำรอง และทุกไฟล์ส่งออกใหม่ทั้งหมด และการเขียนทับครั้งใหญ่แบบนั้นเองคือจุดที่ระบบจัดเก็บมักทำข้อมูลหาย
  • รหัสกู้คืนขนาด 160 บิตสามารถห่อหุ้มกุญแจหลักตัวเดียวกันได้อย่างเป็นอิสระ ลืมรหัสผ่านจึงยังกู้คืนได้ รหัสนี้แสดงเพียงครั้งเดียว ต้องพิมพ์กลับเพื่อยืนยัน และถูกเปลี่ยนใหม่หลังการใช้งานทุกครั้ง โดยจะไม่มีการเขียนอะไรลงดิสก์จนกว่าผู้ใช้จะยืนยันแล้ว

อะไรถูกเข้ารหัส และอะไรไม่ถูกเข้ารหัส

เมื่อเปิดการป้องกันด้วยรหัสผ่าน ระเบียนบัญชีทั้งหมดจะถูกเข้ารหัส ยกเว้นตัวระบุและลายนิ้วมือข้อมูล รวมถึงชื่อบริการด้วย โปรไฟล์ที่ถูกขโมยไปจึงไม่เปิดเผยว่าผู้ใช้มีบัญชีอยู่กับบริการใดบ้าง เมื่อเปิดใช้งาน ส่วนขยายจะเข้ารหัสระเบียน ตรวจสอบด้วยการถอดรหัสแล้วเทียบกัน จากนั้นจึงลบสำเนาที่เป็นข้อความธรรมดาทั้งหมด ทั้งที่เก็บในเครื่องของเบราว์เซอร์ ข้อมูลซิงค์ และสแนปช็อตสำรองแบบหมุนเวียนทั้งเจ็ดชุด

ขอพูดตรง ๆ เพราะมีผลต่อการประเมินของคุณ:

  • เมื่อปิดการป้องกันด้วยรหัสผ่าน บัญชีจะถูกจัดเก็บโดยไม่เข้ารหัส และหากเปิด Chrome Sync ไว้ ข้อมูลจะถูกทำซ้ำผ่านบัญชี Google ของผู้ใช้เอง ข้อมูลเหล่านั้นไม่เคยมาถึงเรา แต่ Google เป็นผู้เก็บไว้ การซิงค์สามารถปิดได้ และการปิดจะลบสิ่งที่อยู่บนนั้นแล้วออกไปด้วย
  • ประวัติการใช้งานรายเว็บไซต์ — ว่าบัญชีไหนถูกใช้กับโดเมนใด — ถูกเก็บไว้ในเครื่องและไม่อยู่ในความคุ้มครองของตู้นิรภัยระหว่างที่กำลังเก็บรวบรวม การเปิดการป้องกันด้วยรหัสผ่านจะลบประวัตินี้ทิ้ง และยังปิดแยกต่างหากได้ด้วย

แบบจำลองภัยคุกคาม

ป้องกันได้

  • ไดเรกทอรีโปรไฟล์ของเบราว์เซอร์ถูกขโมยหรือถูกคัดลอก
  • มัลแวร์ประเภท infostealer ที่ดูดข้อมูลเบราว์เซอร์ออกไปทั้งก้อน
  • ผู้ที่เข้าถึงเครื่องที่ถูกทิ้งไว้โดยไม่มีคนดูแลได้โดยตรง
  • ระเบียนบัญชีเดินทางไปถึง Google ผ่าน Chrome Sync
  • ไฟล์สำรองข้อมูลสูญหายหรือถูกขโมย (ไฟล์ส่งออกที่ป้องกันด้วยรหัสผ่าน)

ป้องกันไม่ได้

  • มัลแวร์ที่ทำงานในสิทธิ์ของผู้ใช้ขณะที่ตู้นิรภัยถูกปลดล็อกอยู่
  • คีย์ล็อกเกอร์ที่ดักรหัสผ่านตอนที่พิมพ์
  • เบราว์เซอร์หรือระบบปฏิบัติการที่ถูกเจาะแล้ว
  • การถูกเจาะของบริการภายนอกที่รหัสเหล่านั้นใช้อยู่

สรุปสั้น ๆ คือ สิ่งนี้ปกป้องข้อมูลในขณะจัดเก็บ แต่ไม่อาจปกป้องอุปกรณ์ที่ตกอยู่ในการควบคุมของผู้โจมตีอยู่แล้วขณะใช้งาน และก็ไม่มีทางทำได้

สิทธิ์

ไฟล์ manifest ประกาศสิทธิ์ไว้เพียงสองรายการ และไม่มีสิทธิ์ระดับโฮสต์เลย:

storage
บัญชีและการตั้งค่าอยู่ในที่เก็บในเครื่อง กุญแจที่ปลดล็อกแล้วอยู่ในที่เก็บระดับเซสชัน และสำเนาสำหรับซิงค์ซึ่งเป็นตัวเลือกเสริม
activeTab
อ่านชื่อโฮสต์ของแท็บที่เปิดอยู่เพื่อไฮไลต์บัญชีที่ตรงกัน และจับภาพแท็บเมื่อผู้ใช้สแกนคิวอาร์โค้ดจากหน้าจอ

ไม่มี content script ใด ๆ ไม่มีสิทธิ์ tabs, cookies หรือ webRequest และไม่มีทรัพยากรที่เว็บเข้าถึงได้ ส่วนขยายนี้อ่านหรือแก้ไขเนื้อหาของหน้าเว็บใด ๆ ไม่ได้เลย

กล้อง

การสแกนคิวอาร์โค้ดด้วยกล้องทำงานบนหน้าของส่วนขยายที่เปิดในแท็บ ไม่ใช่ในหน้าต่างป็อปอัป เพราะป็อปอัปจะถูกทำลายทันทีที่เสียโฟกัส ซึ่งกล่องขอสิทธิ์ทำแบบนั้นพอดี เรื่องนี้ไม่ต้องใช้สิทธิ์ใดใน manifest โดยใช้กล่องขอสิทธิ์กล้องมาตรฐานของเบราว์เซอร์ ให้สิทธิ์ตาม origin ของส่วนขยายและเพิกถอนได้ในการตั้งค่าเว็บไซต์ และจะไม่ถูกร้องขอจนกว่าผู้ใช้จะเปิดตัวสแกนเอง วิดีโอถูกถอดรหัสในเครื่องและไม่เคยถูกส่งออกหรือบันทึกไว้

การเชื่อมต่อออกภายนอก

ในการใช้งานตามปกติ ส่วนขยายไม่ส่งคำขอโดยอัตโนมัติเลย และ Manifest V3 ก็ห้ามโค้ดจากระยะไกล การเชื่อมต่อทั้งหมดที่เป็นไปได้มีดังนี้:

โฮสต์เมื่อใดมีข้อมูลผู้ใช้ไปด้วยหรือไม่
worldtimeapi.org
timeapi.io
ตรวจความคลาดเคลื่อนของนาฬิกา มีแคช และหากล้มเหลวก็ผ่านไปเงียบ ๆ นาฬิกาที่เพี้ยนทำให้ TOTP ใช้ไม่ได้ไม่มี
authenticator.shหน้าต้อนรับตอนติดตั้ง และหน้าให้ความเห็นตอนถอนการติดตั้งหรือให้คะแนนไม่มี (มีเพียงบันทึกเว็บเซิร์ฟเวอร์ตามปกติ)

ไม่มีฟอนต์ สคริปต์ สไตล์ หรือรูปภาพใดถูกโหลดจากโฮสต์ภายนอก ทุกอย่างที่ใช้แสดงผลอินเทอร์เฟซมาพร้อมในแพ็กเกจแล้ว

การตรวจสอบสิ่งที่เราเผยแพร่

คุณไม่จำเป็นต้องเชื่อสิ่งที่กล่าวมาข้างต้นเลยสักข้อ ส่วนขยายนี้เป็นโอเพนซอร์ส และทุกรุ่นสร้างซ้ำได้:

  1. ดาวน์โหลดไฟล์ .crx ที่เผยแพร่จาก Chrome Web Store แล้วแตกไฟล์
  2. เช็กเอาต์ไปยังแท็ก git ที่ตรงกัน
  3. รัน npm ci && npm run build บน Node 20 LTS
  4. เทียบโฟลเดอร์ dist/ ที่ได้กับแพ็กเกจที่แตกไฟล์ไว้

ทุกรุ่นที่ปล่อยบน GitHub จะมาพร้อมค่า SHA-256 ของทุกไฟล์ใน dist/ ที่บิลด์ได้ ในชื่อ SHA256SUMS-v<version>.txt และอยู่ในรูปแบบ sha256sum ขั้นตอนที่ 4 จึงเหลือเพียงการรัน sha256sum -c ครั้งเดียว ความแตกต่างควรจำกัดอยู่ที่ลำดับไฟล์ภายในไฟล์บีบอัด และช่องว่างในผลลัพธ์ที่ถูกย่อขนาดระหว่าง Node คนละรุ่นย่อย

แพ็กเกจที่ต้องใช้ตอนรันมีน้อยโดยตั้งใจ ได้แก่ OTPAuth, React, jsQR, Zustand, Framer Motion และ Lucide ทั้งหมดถูกตรึงเวอร์ชันด้วย lockfile ที่คอมมิตไว้ในรีโป และเรามี SBOM รูปแบบ CycloneDX ให้เมื่อร้องขอ

ดูซอร์สโค้ด

สิ่งที่เราไม่มี

เราเป็นผู้พัฒนารายเล็กและเป็นอิสระ หากข้อใดข้อหนึ่งต่อไปนี้เป็นข้อกำหนดที่ยืดหยุ่นไม่ได้ในกระบวนการของคุณ รู้ตอนนี้ย่อมดีกว่ารู้ตอนที่ประเมินไปแล้วสามสัปดาห์:

  • ไม่มีใบรับรอง SOC 2, ISO 27001 หรือเทียบเท่า
  • จนถึงวันนี้ยังไม่เคยว่าจ้างให้ทำ penetration test จากภายนอก
  • ไม่มีโครงการ bug bounty แบบมีเงินรางวัล

สิ่งที่เรามีให้แทนคือความโปร่งใสของซอร์สโค้ดทั้งหมด บิลด์ที่ตรวจสอบได้ สิทธิ์ที่ขอน้อยที่สุด และการไม่มีโครงสร้างเซิร์ฟเวอร์ที่จะเก็บข้อมูลของคุณได้ตั้งแต่แรก

ติดต่อเรา

รายงานช่องโหว่และคำถามด้านความปลอดภัย: security@authenticator.sh นโยบายการเปิดเผย ขอบเขต เวลาตอบกลับ และเงื่อนไข safe harbour อยู่ในหน้านโยบายความปลอดภัย ส่วนข้อมูลใดถูกเก็บและข้อมูลใดออกจากเครื่องนั้นระบุไว้ในนโยบายความเป็นส่วนตัว

เรายินดีตอบแบบสอบถามประเมินผู้ให้บริการเป็นลายลักษณ์อักษร หรือพาทีมความปลอดภัยไล่อ่านโค้ดไปด้วยกัน

เรื่องอื่นที่ไม่ใช่ความปลอดภัย เช่น การติดตั้ง การกู้คืนบัญชี หรือคำถามเรื่องการเรียกเก็บเงินจากการนำไปใช้ในองค์กร ดูได้ที่หน้าสนับสนุน และกรุณาอย่าส่งรายงานช่องโหว่ไปที่นั่น เพราะกล่องข้อความนั้นไม่ได้ถูกจัดการแบบเป็นความลับ