ਇੱਕ 65-ਬਾਈਟ ਦੀ ਮਾਡਲ ਫਾਈਲ ਪ੍ਰਸਿੱਧ Llama CPP inference engine ਨੂੰ ਅਚਾਨਕ ਰੋਕ ਸਕਦੀ ਹੈ। ਇਹ ਛੋਟਾ ਜਿਹਾ payload ਪਾਰਸਰ ਦੇ ਅੰਦਰ division-by-zero ਨੂੰ ਤ੍ਰਿਗਰ ਕਰਦਾ ਹੈ, ਜਿਸ ਨਾਲ SIGFPE ਕ੍ਰੈਸ਼ ਹੋ ਜਾਂਦਾ ਹੈ।
ਕ੍ਰੈਸ਼ ਕਿਉਂ ਮਹੱਤਵਪੂਰਨ ਹੈ
ਕੀ ਗਲਤ ਹੋਇਆ
ਪਾਰਸਰ ਮਾਡਲ metadata ਨੂੰ C++ structures ਵਿੱਚ ਪੜ੍ਹਦਾ ਹੈ ਅਤੇ ਚੈੱਕ ਕਰਦਾ ਹੈ ਕਿ ਹਰੇਕ tensor dimension “non-negative” (ਗੈਰ-ਨਕਾਰਾਤਮਕ) ਹੈ। ਜ਼ੀਰੋ (zero) ਉਸ ਸ਼ਰਤ ਨੂੰ ਪੂਰਾ ਕਰਦਾ ਹੈ, ਇਸ ਲਈ ਚੈੱਕ ਪਾਸ ਹੋ ਜਾਂਦਾ ਹੈ। ਕੋਡ ਦੀ ਅਗਲੀ ਲਾਈਨ ਫਿਰ ਉਸ dimension ਨੂੰ ਇੱਕ ਅਜਿਹੀ ਗਣਨਾ ਵਿੱਚ divisor ਵਜੋਂ ਵਰਤਦੀ ਹੈ ਜੋ ਇਹ ਮੰਨ ਕੇ ਚੱਲਦੀ ਹੈ ਕਿ ਮੁੱਲ positive (ਧਨਾਤਮਕ) ਹੈ। ਜਦੋਂ dimension ਜ਼ੀਰੋ ਹੁੰਦਾ ਹੈ, ਤਾਂ ਭਾਗ ਕਰਨ ਦੀ ਪ੍ਰਕਿਰਿਆ ਇੱਕ floating-point exception (SIGFPE) ਪੈਦਾ ਕਰਦੀ ਹੈ ਅਤੇ ਪ੍ਰੋਗਰਾਮ ਨੂੰ ਬੰਦ ਕਰ ਦਿੰਦੀ ਹੈ।
ਵੈਲੀਡੇਸ਼ਨ ਨੇ ਲੋੜੀਂਦੇ invariant ਦੇ ਸਿਰਫ਼ ਅੱਧੇ ਹਿੱਸੇ ਨੂੰ ਕਵਰ ਕੀਤਾ: ਇਸਨੇ ਨਕਾਰਾਤਮਕ ਮੁੱਲਾਂ ਨੂੰ ਤਾਂ ਰੋਕ ਦਿੱਤਾ ਪਰ ਜ਼ੀਰੋ ਨੂੰ ਨਜ਼ਰਅੰਦਾਜ਼ ਕਰ ਦਿੱਤਾ, ਜੋ ਕਿ ਅਗਲੀ ਗਣਨਾ ਲਈ ਉਨਾ ਹੀ ਅਸੁਰੱਖਿਅਤ ਹੈ।
ਡਿਵੈਲਪਰਾਂ ਨੂੰ ਕੀ ਕਰਨਾ ਚਾਹੀਦਾ ਹੈ
- ਮਾਡਲ ਫਾਈਲਾਂ ਨੂੰ binaries ਵਾਂਗ ਸਮਝੋ। ਮਾਡਲ ਲੋਡ ਕਰਨਾ raw bytes ਨੂੰ memory structures ਵਿੱਚ ਪਾਰਸ ਕਰਦਾ ਹੈ, ਜੋ ਕਿ ਇੱਕ ਅਜਿਹੀ ਸੀਮਾ ਹੈ ਜਿੱਥੇ ਅਣਚੈੱਕ ਡੇਟਾ ਪ੍ਰੋਸੈਸ ਨੂੰ ਕ੍ਰੈਸ਼ ਕਰ ਸਕਦਾ ਹੈ ਜਾਂ ਇਸ ਤੋਂ ਵੀ ਮਾੜਾ ਕੁਝ ਕਰ ਸਕਦਾ ਹੈ।
- ਅਧੂਰੇ ਚੈੱਕਾਂ ਤੋਂ ਬਚੋ। ਅਜਿਹੀ ਸ਼ਰਤ ਜੋ ਲੋੜੀਂਦੇ invariant ਦੇ ਸਿਰਫ਼ ਇੱਕ ਹਿੱਸੇ ਨੂੰ ਕਵਰ ਕਰਦੀ ਹੈ, ਸੁਰੱਖਿਆ ਦਾ ਇੱਕ ਝੂਠਾ ਅਹਿਸਾਸ ਦਿੰਦੀ ਹੈ। ਇੱਥੇ, “non-negative” ਕਾਫ਼ੀ ਨਹੀਂ ਸੀ; ਕੋਡ ਨੂੰ “positive” ਦੀ ਲੋੜ ਸੀ।
- ਹਰੇਕ ਚੈੱਕ ਤੋਂ ਬਾਅਦ ਅਨੁਮਾਨਾਂ 'ਤੇ ਸਵਾਲ ਉਠਾਓ। ਜਦੋਂ ਕੋਈ bounds test ਆਉਂਦਾ ਹੈ, ਤਾਂ ਇਹ ਯਕੀਨੀ ਬਣਾਓ ਕਿ ਅਗਲਾ ਕੋਡ ਕਿਸੇ ਸਖ਼ਤ ਗੁਣ (stricter property) 'ਤੇ ਨਿਰਭਰ ਨਹੀਂ ਹੈ।
- fuzzing tools ਦੀ ਵਰਤੋਂ ਕਰੋ। ਲੇਖਕ ਨੇ AddressSanitizer ਦੇ ਨਾਲ libFuzzer ਚਲਾ ਕੇ ਇਸ ਬੱਗ ਦਾ ਪਤਾ ਲਗਾਇਆ, ਜੋ ਇਨਪੁੱਟਸ ਨੂੰ ਬਦਲਦਾ ਹੈ ਅਤੇ ਜ਼ੀਰੋ ਨਾਲ ਭਾਗ ਕਰਨ ਵਰਗੇ ਗੈਰ-ਕਾਨੂੰਨੀ ਕੰਮਾਂ ਨੂੰ ਫਲੈਗ ਕਰਦਾ ਹੈ।
ਫਿਕਸ ਕਿਵੇਂ ਲਾਗੂ ਕੀਤਾ ਗਿਆ
ਫਿਕਸ ਇੱਕ ਗਾਰਡ (guard) ਜੋੜਦਾ ਹੈ ਜੋ ਉਦੋਂ overflow ਗਣਨਾ ਨੂੰ ਛੱਡ ਦਿੰਦਾ ਹੈ ਜਦੋਂ dimension ਜ਼ੀਰੋ ਦੇ ਬਰਾਬਰ ਹੁੰਦਾ ਹੈ। ਇਹ ਛੋਟੀ ਜਿਹੀ ਸ਼ਰਤ (conditional) ਜਾਇਜ਼ ਜ਼ੀਰੋ-ਸਾਈਜ਼ਡ tensors—ਜੋ ਕੁਝ ਮਾਡਲ ਵੇਰੀਐਂਟਸ ਵਿੱਚ ਵਿਕਲਪਿਕ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਲਈ ਵਰਤੇ ਜਾਂਦੇ ਹਨ—ਦੀ ਸਪੋਰਟ ਨੂੰ ਬਰਕਰਾਰ ਰੱਖਦੀ ਹੈ, ਜਦੋਂ ਕਿ ਕ੍ਰੈਸ਼ ਦੇ ਰਸਤੇ ਨੂੰ ਖਤਮ ਕਰਦੀ ਹੈ।
ਸਿੱਖਿਆ (Takeaway): ਇੱਕ ਇਕੱਲੀ 65-ਬਾਈਟ ਦੀ ਫਾਈਲ ਵਿਆਪਕ ਤੌਰ 'ਤੇ ਵਰਤੇ ਜਾਣ ਵਾਲੇ inference engine ਨੂੰ ਬੰਦ ਕਰ ਸਕਦੀ ਹੈ; ਪੂਰੀ ਤਰ੍ਹਾਂ ਵੈਲੀਡੇਸ਼ਨ ਅਤੇ ਵਿਵਸਥਿਤ fuzzing ਮਾਡਲ ਲੋਡਰਾਂ ਨੂੰ ਸੁਰੱਖਿਅਤ ਰੱਖਦੀ ਹੈ।
ਸਰੋਤ: https://dev.to/harrisonsec/your-model-file-is-untrusted-input-1eap
