65-ಬೈಟ್ನ ಮಾಡೆಲ್ ಫೈಲ್ ಜನಪ್ರಿಯ Llama CPP ಇನ್ಫರೆನ್ಸ್ ಇಂಜಿನ್ ಅನ್ನು ಹಠಾತ್ತಾಗಿ ಸ್ಥಗಿತಗೊಳಿಸಬಹುದು. ಈ ಸಣ್ಣ ಪೇಲೋಡ್ ಪಾರ್ಸರ್ನೊಳಗೆ 'division-by-zero' (ಶೂನ್ಯದಿಂದ ಭಾಗಿಸುವಿಕೆ) ಪ್ರಕ್ರಿಯೆಯನ್ನು ಪ್ರಚೋದಿಸುತ್ತದೆ, ಇದರಿಂದಾಗಿ SIGFPE ಕ್ರ್ಯಾಶ್ ಉಂಟಾಗುತ್ತದೆ.
ಈ ಕ್ರ್ಯಾಶ್ ಏಕೆ ಮುಖ್ಯ
ಏನಾಗ ತಪ್ಪಾಗಿದೆ
ಪಾರ್ಸರ್ ಮಾಡೆಲ್ ಮೆಟಾಡ worlds ಅನ್ನು C++ ಸ್ಟ್ರಕ್ಚರ್ಗಳಿಗೆ ಓದುತ್ತದೆ ಮತ್ತು ಪ್ರತಿ ಟೆನ್ಸರ್ ಡೈಮೆನ್ಶನ್ (tensor dimension) "non-negative" (ಋಣಾತ್ಮಕವಲ್ಲದ) ಆಗಿದೆಯೇ ಎಂದು ಪರಿಶೀಲಿಸುತ್ತದೆ. ಶೂನ್ಯವು (Zero) ಆ ಷರತ್ತನ್ನು ಪೂರೈಸುತ್ತದೆ, ಆದ್ದರಿಂದ ಪರಿಶೀಲನೆ ಯಶಸ್ವಿಯಾಗುತ್ತದೆ. ನಂತರದ ಕೋಡ್ ಸಾಲು ಆ ಡೈಮೆನ್ಶನ್ ಅನ್ನು ಒಂದು ಧನಾತ್ಮಕ (positive) ಮೌಲ್ಯವೆಂದು ಭಾವಿಸಿ, ಲೆಕ್ಕಾಚಾರದಲ್ಲಿ ವಿಭಾಜಕವಾಗಿ (divisor) ಬಳಸುತ್ತದೆ. ಡೈಮೆನ್ಶನ್ ಶೂನ್ಯವಾದಾಗ, ಆ ಭಾಗಾಕಾರವು ಫ್ಲೋಟಿಂಗ್-ಪಾಯಿಂಟ್ ಎಕ್ಸೆಪ್ಶನ್ (SIGFPE) ಅನ್ನು ಉಂಟುಮಾಡಿ ಪ್ರೋಗ್ರಾಂ ಅನ್ನು ಸ್ಥಗಿತಗೊಳಿಸುತ್ತದೆ.
ಈ ವ್ಯಾಲಿಡೇಶನ್ ಅಗತ್ಯವಿರುವ ಇನ್ವೇರಿಯಂಟ್ನ (invariant) ಅರ್ಧದಷ್ಟನ್ನು ಮಾತ್ರ ಒಳಗೊಂಡಿತ್ತು: ಇದು ಋಣಾತ್ಮಕ ಮೌಲ್ಯಗಳನ್ನು ತಡೆದಿದ್ದರೂ, ಶೂನ್ಯವನ್ನು ನಿರ್ಲಕ್ಷಿಸಿತು, ಇದು ಮುಂದಿನ ಗಣಿತದ ಕ್ರಿಯೆಗಳಿಗೆ ಅಷ್ಟೇ ಅಸುರಕ್ಷಿತವಾಗಿದೆ.
ಡೆವಲಪರ್ಗಳು ಏನು ಮಾಡಬೇಕು
- ಮಾಡೆಲ್ ಫೈಲ್ಗಳನ್ನು ಬೈನರಿಗಳಂತೆ ಪರಿಗಣಿಸಿ. ಮಾಡೆಲ್ ಲೋಡ್ ಮಾಡುವುದು ರೊ (raw) ಬೈಟ್ಗಳನ್ನು ಮೆಮೊರಿ ಸ್ಟ್ರಕ್ಚರ್ಗಳಿಗೆ ಪಾರ್ಸ್ ಮಾಡುತ್ತದೆ, ಇದು ಅನ್ಚೆಕ್ ಮಾಡದ ಡೇಟಾ ಪ್ರಕ್ರಿಯೆಯನ್ನು ಕ್ರ್ಯಾಶ್ ಮಾಡಬಹುದಾದ ಅಥವಾ ಅದಕ್ಕಿಂತ ಕೆಟ್ಟದನ್ನು ಮಾಡಬಹುದಾದ ಒಂದು ಪ್ರಮುಖ ಹಂತವಾಗಿದೆ.
- ಅರೆಬರೆ ಪರಿಶೀಲನೆಗಳನ್ನು ತಪ್ಪಿಸಿ. ಅಗತ್ಯವಿರುವ ಇನ್ವೇರಿಯಂಟ್ನ ಒಂದು ಭಾಗವನ್ನು ಮಾತ್ರ ಒಳಗೊಂಡಿರುವ ಕಂಡೀಶನ್ ಸುಳ್ಳು ಭದ್ರತೆಯ ಭಾವನೆಯನ್ನು ನೀಡುತ್ತದೆ. ಇಲ್ಲಿ, "non-negative" ಎಂಬುದು ಸಾಕಾಗಲಿಲ್ಲ; ಕೋಡ್ಗೆ "positive" ಎಂಬುದು ಅಗತ್ಯವಿತ್ತು.
- ಪ್ರತಿ ಪರಿಶೀಲನೆಯ ನಂತರದ ಕಲ್ಪನೆಗಳನ್ನು ಪ್ರಶ್ನಿಸಿ. ಬೌಂಡ್ಸ್ ಟೆಸ್ಟ್ (bounds test) ಬಂದಾಗ, ಅದರ ನಂತರದ ಕೋಡ್ ಯಾವುದಾದರೂ ಕಟ್ಟುನಿಟ್ಟಾದ ಗುಣಲಕ್ಷಣದ ಮೇಲೆ ಅವಲಂಬಿತವಾಗಿಲ್ಲ ಎಂಬುದನ್ನು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಿ.
- ಫಸಿಂಗ್ (fuzzing) ಪರಿಕರಗಳನ್ನು ಬಳಸಿ. ಲೇಖಕರು AddressSanitizer ಜೊತೆಗೆ libFuzzer ಅನ್ನು ಚಲಾಯಿಸುವ ಮೂಲಕ ಈ ಬಗ್ ಅನ್ನು ಪತ್ತೆಹಚ್ಚಿದರು, ಇದು ಇನ್ಪುಟ್ಗಳನ್ನು ಬದಲಾಯಿಸುತ್ತದೆ (mutates) ಮತ್ತು ಶೂನ್ಯದಿಂದ ಭಾಗಿಸುವಿಕೆಯಂತಹ ಅಕ್ರಮ ಕಾರ್ಯಾಚರಣೆಗಳನ್ನು ಗುರುತಿಸುತ್ತದೆ.
ಪರಿಹಾರವನ್ನು ಹೇಗೆ ಅನ್ವಯಿಸಲಾಯಿತು
ಈ ಪರಿಹಾರವು ಡೈಮೆನ್ಶನ್ ಶೂನ್ಯವಾಗಿದ್ದಾಗ ಓವರ್ಫ್ಲೋ ಲೆಕ್ಕಾಚಾರವನ್ನು ಬಿಟ್ಟುಬಿಡುವ ಒಂದು ಗಾರ್ಡ್ (guard) ಅನ್ನು ಸೇರಿಸುತ್ತದೆ. ಈ ಸಣ್ಣ ಕಂಡೀಷನಲ್, ಕೆಲವು ಮಾಡೆಲ್ ವೇರಿಯಂಟ್ಗಳಲ್ಲಿ ಐಚ್ಛಿಕ ಫೀಚರ್ಗಳಿಗಾಗಿ ಬಳಸಲಾಗುವ ಕಾನೂನುಬದ್ಧ ಶೂನ್ಯ-ಅಳತೆಯ ಟೆನ್ಸರ್ಗಳ (zero-sized tensors) ಬೆಂಬಲವನ್ನು ಉಳಿಸಿಕೊಳ್ಳುವ ಜೊತೆಗೆ, ಕ್ರ್ಯಾಶ್ ಆಗುವ ಸಾಧ್ಯತೆಯನ್ನು ಇಲ್ಲದ ಮಾಡುತ್ತದೆ.
ಸಾರಾಂಶ: ಕೇವಲ ಒಂದು 65-ಬೈಟ್ ಫೈಲ್ ವ್ಯಾಪಕವಾಗಿ ಬಳಕೆಯಲ್ಲಿರುವ ಇನ್ಫರೆನ್ಸ್ ಇಂಜಿನ್ ಅನ್ನು ಸ್ಥಗಿತಗೊಳಿಸಬಹುದು; ಸಮಗ್ರ ವ್ಯಾಲಿಡೇಶನ್ ಮತ್ತು ವ್ಯವಸ್ಥಿತ ಫಸಿಂಗ್ ಮಾಡೆಲ್ ಲೋಡರ್ಗಳನ್ನು ಸುರಕ್ಷಿತವಾಗಿಡುತ್ತದೆ.
ಮೂಲ: https://dev.to/harrisonsec/your-model-file-is-untrusted-input-1eap
