<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-18836672</id><updated>2012-01-17T06:16:52.689-08:00</updated><title type='text'>Andrew Max blog</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://andrewmax.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18836672/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://andrewmax.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Andrew Max</name><uri>http://www.blogger.com/profile/10398031744062944433</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>6</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-18836672.post-116756600400621913</id><published>2006-12-31T03:31:00.000-08:00</published><updated>2007-03-22T07:29:08.843-07:00</updated><title type='text'>Security flaw fixed</title><content type='html'>Unfortunately, I didn't have enough time to post this note earlier – I was totally booked, and that was much more important than Internet, web forums and blogs...&lt;br /&gt;&lt;br /&gt;At October 17th Oracle officially released eighth Critical Patch Update (CPU). This CPU fixes about one hundred Oracle bugs, and its advisory is currently available at:&lt;br /&gt;&lt;a href="http://www.oracle.com/technology/deploy/security/critical-patch-updates/cpuoct2006.html"&gt;http://www.oracle.com/technology/deploy/security/critical-patch-updates/cpuoct2006.html&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;Among others, it finally suggests a fix to the dire security hole I came across in April:&lt;br /&gt;&lt;a href="http://andrewmax.blogspot.com/2006/04/yet-another-security-alert.html"&gt;http://andrewmax.blogspot.com/2006/04/yet-another-security-alert.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I have applied October CPU and, according to tests I've made, the problem is really resolved – any attempt of unauthorized data modification now fails with ORA-01031 (insufficient privileges) error.&lt;br /&gt;My corresponding Metalink SR got finally closed.&lt;br /&gt;&lt;br /&gt;In "Credits" section of CPU advisory, Oracle kindly credited me as well as other persons and organizations for bringing security problems to Oracle’s attention:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;The following people discovered and brought security vulnerabilities addressed by this Critical Patch Update to Oracle's attention: Johannes Fahrenkrug; Sacha Faust of S.P.I. Dynamics, Inc.; Esteban Martinez Fayo of Application Security, Inc.; Jeff Kayser of Database Doctor, Inc.; Alexander Kornbrust of Red Database Security GmbH; David Litchfield of Next Generation Security Software Ltd.; &lt;span style="font-style:italic;"&gt;and Andrew Maksimenko of COMEC-92&lt;/span&gt; (me).&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;I'm very glad to realize that the story is over – having such hole unfixed for a long time is like sitting on a ticking bomb: sooner or later, it goes.&lt;br /&gt;In short - I’d recommend &lt;span style="font-style:italic;"&gt;applying October CPU as soon as possible&lt;/span&gt;, or else you leave your Oracle database vulnerable, both data integrity and security can be easily compromised.&lt;br /&gt;&lt;br /&gt;Andrew.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18836672-116756600400621913?l=andrewmax.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andrewmax.blogspot.com/feeds/116756600400621913/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18836672&amp;postID=116756600400621913' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18836672/posts/default/116756600400621913'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18836672/posts/default/116756600400621913'/><link rel='alternate' type='text/html' href='http://andrewmax.blogspot.com/2006/12/security-flaw-fixed.html' title='Security flaw fixed'/><author><name>Andrew Max</name><uri>http://www.blogger.com/profile/10398031744062944433</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18836672.post-114799547482271962</id><published>2006-05-18T16:22:00.000-07:00</published><updated>2006-08-03T13:12:52.010-07:00</updated><title type='text'>A silent but important change</title><content type='html'>While learning Oracle and working with it, sometimes I’m getting really surprised. Especially when I discover odd differences between reality and what documentation states.&lt;br /&gt;&lt;br /&gt;Few months ago I noticed one silent change in Oracle locking strategy that was introduced since Oracle 9.2.0.6.0 (and 10.1.0.4.0, for 10g family). I called it “silent” because it’s not reflected anywhere in Oracle documentation yet despite the fact that it may break logic of some applications where manual locking statements (e.g. LOCK TABLE) are used. And what is more confusing, there are only two Metalink bug notes (&lt;a href="http://metalink.oracle.com/metalink/plsql/ml2_documents.showDocument?p_database_id=BUG&amp;p_id=4115353"&gt;4115353&lt;/a&gt; and &lt;a href="http://metalink.oracle.com/metalink/plsql/ml2_documents.showDocument?p_database_id=BUG&amp;p_id=4252394"&gt;4252394&lt;/a&gt;), from which one can conclude that locking behavior was changed intentionally, to fix some locking-related bug in RAC environments.&lt;br /&gt;&lt;br /&gt;Here are details. One can repeat this small test in Oracle 9.2.0.5.0 and earlier:&lt;br /&gt;&lt;br /&gt;&lt;PRE style="font: 13px Courier New"&gt;SQL&gt; show release&lt;br /&gt;release 902000500&lt;br /&gt;SQL&gt;&lt;br /&gt;SQL&gt; create table t(x) as&lt;br /&gt;  2  select * from dual;&lt;br /&gt; &lt;br /&gt;Table created.&lt;br /&gt; &lt;br /&gt;SQL&gt; select * from t for update;&lt;br /&gt; &lt;br /&gt;X&lt;br /&gt;-&lt;br /&gt;X&lt;br /&gt; &lt;br /&gt;SQL&gt; select type, lmode&lt;br /&gt;  2    from v$lock&lt;br /&gt;  3   where request = 0 and&lt;br /&gt;  4   sid = (select sid&lt;br /&gt;  5            from v$mystat&lt;br /&gt;  6           where rownum = 1);&lt;br /&gt; &lt;br /&gt;TY      LMODE&lt;br /&gt;-- ----------&lt;br /&gt;TX          6&lt;br /&gt;TM          2&lt;/PRE&gt;&lt;br /&gt;&lt;br /&gt;So everything is as expected: SELECT ... FOR UPDATE applied TX lock in mode 6 as well as TM lock in mode 2 (also called "row share" lock).&lt;br /&gt;&lt;br /&gt;But look what will happen if we rerun our small test in 9.2.0.6.0:&lt;br /&gt;&lt;br /&gt;&lt;PRE style="font: 13px Courier New"&gt;SQL&gt; show release&lt;br /&gt;release 902000600&lt;br /&gt; &lt;br /&gt;...&lt;br /&gt;&lt; rerun "create table" and &lt;br /&gt;  "select ... for update" here &gt;&lt;br /&gt;...&lt;br /&gt; &lt;br /&gt;SQL&gt; select type, lmode&lt;br /&gt;  2    from v$lock&lt;br /&gt;  3   where request = 0 and&lt;br /&gt;  4   sid = (select sid&lt;br /&gt;  5            from v$mystat&lt;br /&gt;  6           where rownum = 1);&lt;br /&gt; &lt;br /&gt;TY      LMODE&lt;br /&gt;-- ----------&lt;br /&gt;TX          6&lt;br /&gt;TM          3&lt;/PRE&gt;&lt;br /&gt;&lt;br /&gt;Well, that was a bit surprising. &lt;span style="font-weight:bold;"&gt;Now Oracle applied TM mode 3 lock&lt;/span&gt; (e.g. "row exclusive" table-level lock) as we issued SELECT ... FOR UPDATE statement.&lt;br /&gt;&lt;br /&gt;The impact of this change on existing applications is not so critical &lt;span style="font-weight:bold;"&gt;unless they have implemented some manual locking strategy&lt;/span&gt;. For example, look what may happen in 9.2.0.6.0 and above:&lt;br /&gt;&lt;br /&gt;&lt;PRE style="font: 13px Courier New"&gt;Session #1&gt; show release&lt;br /&gt;release 902000600&lt;br /&gt;Session #1&gt;&lt;br /&gt;Session #1&gt; lock table t in share mode;&lt;br /&gt; &lt;br /&gt;Table(s) Locked.&lt;br /&gt; &lt;br /&gt;Session #2&gt; show release&lt;br /&gt;release 902000600&lt;br /&gt;Session #2&gt;&lt;br /&gt;Session #2&gt; select * from t for update nowait;&lt;br /&gt;select * from t for update nowait&lt;br /&gt;              *&lt;br /&gt;ERROR at line 1:&lt;br /&gt;ORA-00054: resource busy and acquire with NOWAIT specified&lt;/PRE&gt;&lt;br /&gt;&lt;br /&gt;SELECT ... FOR UPDATE NOWAIT statement in session 2 failed, but it succeeds in Oracle 9.2.0.5.0 and earlier (10.1.0.3.0 and earlier).&lt;br /&gt;&lt;br /&gt;Small change, but it may cause a bit of headache to someone who doesn’t know about it.&lt;br /&gt;&lt;br /&gt;Andrew.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18836672-114799547482271962?l=andrewmax.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andrewmax.blogspot.com/feeds/114799547482271962/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18836672&amp;postID=114799547482271962' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18836672/posts/default/114799547482271962'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18836672/posts/default/114799547482271962'/><link rel='alternate' type='text/html' href='http://andrewmax.blogspot.com/2006/05/silent-but-important-change.html' title='A silent but important change'/><author><name>Andrew Max</name><uri>http://www.blogger.com/profile/10398031744062944433</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18836672.post-114782182247214130</id><published>2006-05-16T16:21:00.000-07:00</published><updated>2006-05-17T03:32:34.873-07:00</updated><title type='text'>It's neat and useful</title><content type='html'>Things change rapidly.&lt;br /&gt;In world of Oracle Database technologies things change so rapidly so it's hardly possible to keep track of them all. But I believe that one should learn something new about Oracle each day - it's the only way to become successful developer or DBA.&lt;br /&gt;&lt;br /&gt;Recently, I was reading and enjoying &lt;a href="http://www.amazon.com/exec/obidos/tg/detail/-/1590596366?v=glance"&gt;new Jonathan's book&lt;/a&gt;, an outstanding work of art for everyone who wants to explore Oracle CBO in detail. While reading it, I noticed small but pretty fascinating remark about a feature I never saw before.&lt;br /&gt;&lt;br /&gt;How many ways to obtain statement execution plan do you know? I'm not going to discuss them all, but I think that EXPLAIN PLAN statement and AUTOTRACE feature are most widely used. For sure, they are simple and convenient but one should be careful when using them, because they can be misleading to some extent. The most important thing to remember is that EXPLAIN PLAN is &lt;span style="font-weight:bold;"&gt;always doing hard parse&lt;/span&gt;. Therefore, for example, side-effects of bind variable peeking will be probably missed.&lt;br /&gt;&lt;br /&gt;And if we want to look at "real" execution plan, which opportunities do we have? I think these are most familiar ones:&lt;br /&gt;1. Using SQL_TRACE and TKPROF, and then analyzing produced trace files.&lt;br /&gt;2. Querying V$SQL and V$SQL_PLAN dynamic views.&lt;br /&gt;&lt;br /&gt;Both options are good, but they require some extra efforts. Well, maybe I'm too lazy, but from Jonathan's book I knew exactly what I was dreaming about. In first release of Oracle 10g, several important enhancements were made to DBMS_XPLAN package, and in particular, new function DISPLAY_CURSOR was added.&lt;br /&gt;&lt;br /&gt;It's nice, and easy to use:&lt;br /&gt;&lt;br /&gt;&lt;PRE style="font: 13px Courier New"&gt;SQL&gt; show release&lt;br /&gt;release 1001000200&lt;br /&gt;SQL&gt; &lt;br /&gt;SQL&gt; create table test(x primary key, y) as&lt;br /&gt;  2  select rownum, rpad('*', 100, '*')&lt;br /&gt;  3    from dual&lt;br /&gt;  4  connect by level &lt;= 1000;&lt;br /&gt; &lt;br /&gt;Table created.&lt;br /&gt; &lt;br /&gt;SQL&gt; begin&lt;br /&gt;  2    dbms_stats.gather_table_stats&lt;br /&gt;  3    (ownname =&gt; user,&lt;br /&gt;  4     tabname =&gt; 'TEST',&lt;br /&gt;  5     estimate_percent =&gt; null,&lt;br /&gt;  6     cascade =&gt; true);&lt;br /&gt;  7  end;&lt;br /&gt;  8  /&lt;br /&gt; &lt;br /&gt;PL/SQL procedure successfully completed.&lt;br /&gt; &lt;br /&gt;SQL&gt; var x number&lt;br /&gt;SQL&gt; &lt;br /&gt;SQL&gt; exec :x := 1000&lt;br /&gt; &lt;br /&gt;PL/SQL procedure successfully completed.&lt;br /&gt; &lt;br /&gt;SQL&gt; explain plan for&lt;br /&gt;  2  select * from test&lt;br /&gt;  3   where x &lt; :x;&lt;br /&gt; &lt;br /&gt;Explained.&lt;br /&gt; &lt;br /&gt;SQL&gt; -- Now, EXPLAIN PLAN tells us&lt;br /&gt;SQL&gt; select * from table(dbms_xplan.display);&lt;br /&gt; &lt;br /&gt;PLAN_TABLE_OUTPUT&lt;br /&gt;------------------------------------------------------------&lt;br /&gt;Plan hash value: 633647876&lt;br /&gt; &lt;br /&gt;------------------------------------------------------------ ...&lt;br /&gt;| Id  | Operation                   | Name        | Rows  |  ...&lt;br /&gt;------------------------------------------------------------ ...&lt;br /&gt;|   0 | SELECT STATEMENT            |             |    50 |  ...&lt;br /&gt;|   1 |  TABLE ACCESS BY INDEX ROWID| TEST        |    50 |  ...&lt;br /&gt;|*  2 |   INDEX RANGE SCAN          | SYS_C005782 |     9 |  ...&lt;br /&gt;------------------------------------------------------------ ...&lt;br /&gt; &lt;br /&gt;Predicate Information (identified by operation id):&lt;br /&gt;---------------------------------------------------&lt;br /&gt; &lt;br /&gt;   2 - access("X"&amp;lt;TO_NUMBER(:X))&lt;br /&gt; &lt;br /&gt;14 rows selected.&lt;br /&gt; &lt;br /&gt;SQL&gt; -- Ok, let's run it...&lt;br /&gt;SQL&gt; select * from test&lt;br /&gt;  2   where x &lt; :x;&lt;br /&gt; &lt;br /&gt;         X Y&lt;br /&gt;---------- -------------------------------------------------- ...&lt;br /&gt;         1 ************************************************** ...&lt;br /&gt;         2 ************************************************** ...&lt;br /&gt;       ... ...&lt;br /&gt;       ... ...&lt;br /&gt;       999 ************************************************** ...&lt;br /&gt; &lt;br /&gt;999 rows selected.&lt;br /&gt; &lt;br /&gt;SQL&gt; select * from table(dbms_xplan.DISPLAY_CURSOR);&lt;br /&gt; &lt;br /&gt;PLAN_TABLE_OUTPUT&lt;br /&gt;-------------------------------------------------------------&lt;br /&gt;SQL_ID  5r7q3102zwvh3, child number 0&lt;br /&gt;-------------------------------------&lt;br /&gt;select * from test  where x &lt; :x&lt;br /&gt; &lt;br /&gt;Plan hash value: 3836831076&lt;br /&gt; &lt;br /&gt;------------------------------------------------------------- ...&lt;br /&gt;| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU ...&lt;br /&gt;------------------------------------------------------------- ...&lt;br /&gt;|   0 | SELECT STATEMENT  |      |       |       |     6 (100 ...&lt;br /&gt;|*  1 |  TABLE ACCESS FULL| TEST |   999 |   101K|     6   (0 ...&lt;br /&gt;------------------------------------------------------------- ...&lt;br /&gt; &lt;br /&gt;Predicate Information (identified by operation id):&lt;br /&gt;---------------------------------------------------&lt;br /&gt; &lt;br /&gt;   1 - filter("X"&lt;:X)&lt;br /&gt; &lt;br /&gt;  &lt;br /&gt;18 rows selected.&lt;/PRE&gt;&lt;br /&gt;&lt;br /&gt;However, one thing to remember: you should &lt;span style="font-weight:bold;"&gt;disable SERVEROUTPUT&lt;/span&gt; before using this feature or else you'll be slightly surprised:&lt;br /&gt;&lt;br /&gt;&lt;PRE style="font: 13px Courier New"&gt;SQL&gt; set SERVEROUTPUT ON&lt;br /&gt;SQL&gt; &lt;br /&gt;SQL&gt; select * from test&lt;br /&gt;  2   where x &lt; :x;&lt;br /&gt; &lt;br /&gt;         X Y&lt;br /&gt;---------- -------------------------------------------------- ...&lt;br /&gt;         1 ************************************************** ...&lt;br /&gt;         2 ************************************************** ...&lt;br /&gt;       ... ...&lt;br /&gt;       ... ...&lt;br /&gt;       999 ************************************************** ...&lt;br /&gt; &lt;br /&gt;999 rows selected.&lt;br /&gt; &lt;br /&gt;SQL&gt; select * from table(dbms_xplan.DISPLAY_CURSOR);&lt;br /&gt; &lt;br /&gt;PLAN_TABLE_OUTPUT&lt;br /&gt;------------------------------------------------------------- ...&lt;br /&gt;SQL_ID  9babjv8yq8ru3, child number 0&lt;br /&gt; &lt;br /&gt;BEGIN DBMS_OUTPUT.GET_LINES(:LINES, :NUMLINES); END;&lt;br /&gt; &lt;br /&gt;NOTE: cannot fetch plan for SQL_ID 9babjv8yq8ru3, CHILD_NUMBER: 0&lt;br /&gt;      Please verify SQL_ID and CHILD_NUMBER;  maybe the plan is&lt;br /&gt;      no longer available in V$SQL_PLAN&lt;br /&gt; &lt;br /&gt; &lt;br /&gt; &lt;br /&gt;8 rows selected.&lt;/PRE&gt;&lt;br /&gt;&lt;br /&gt;Neat feature. I liked it.&lt;br /&gt;&lt;br /&gt;Andrew.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18836672-114782182247214130?l=andrewmax.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andrewmax.blogspot.com/feeds/114782182247214130/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18836672&amp;postID=114782182247214130' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18836672/posts/default/114782182247214130'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18836672/posts/default/114782182247214130'/><link rel='alternate' type='text/html' href='http://andrewmax.blogspot.com/2006/05/its-neat-and-useful.html' title='It&apos;s neat and useful'/><author><name>Andrew Max</name><uri>http://www.blogger.com/profile/10398031744062944433</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18836672.post-114658949679923070</id><published>2006-05-02T09:58:00.000-07:00</published><updated>2006-05-04T11:59:32.080-07:00</updated><title type='text'>Too late</title><content type='html'>&lt;span style="font-family:courier new;"&gt;Recently I’ve decided to remove my previous post because things turned out to be worse than I expected. Briefly speaking, April 2006 CPU released by Oracle Corp. does not solve the problem: unfortunately, that serious vulnerability is still relevant.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Now, I must stress: &lt;span style="font-weight: bold;"&gt;at the moment I published my previous post, I was pretty sure that problem is nearly fixed&lt;/span&gt;: Oracle Support told me that "it’s well-known security vulnerability that will be solved by April CPU". That CPU is already released, however, as I already mentioned, it does not suggest a fix to that issue. Seems that Oracle support guys &lt;span style="font-weight: bold;"&gt;didn’t get me right&lt;/span&gt; from the very beginning, but I’m not going to speculate about possible reasons...&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;And now, I feel that I’m in a tricky situation of some kind: being sure that the problem is about to be fixed soon, I published pretty critical information here. Though I didn’t mention any details, it’s still critical I think.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;So I decided to remove it once and forever, but then I eventually discovered that it’s just too late. The same web page, &lt;a href="http://www.red-database-security.com/advisory/oracle_modify_data_via_views.html"&gt;http://www.red-database-security.com/advisory/oracle_modify_data_via_views.html&lt;/a&gt;, was updated days ago with information from my blog. For sure, I don’t know Alexander Kornbrust personally (a man who seem to head up that company) but I believe that he understands responsibility and won’t publish any critical details on his website.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;It seems that there’s no way back, and it obviously does not make me happy. So I am leaving my previous post "as it is", with sincere hope for better future.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Andrew. &lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18836672-114658949679923070?l=andrewmax.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andrewmax.blogspot.com/feeds/114658949679923070/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18836672&amp;postID=114658949679923070' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18836672/posts/default/114658949679923070'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18836672/posts/default/114658949679923070'/><link rel='alternate' type='text/html' href='http://andrewmax.blogspot.com/2006/05/too-late.html' title='Too late'/><author><name>Andrew Max</name><uri>http://www.blogger.com/profile/10398031744062944433</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18836672.post-114520527149964869</id><published>2006-04-16T09:30:00.000-07:00</published><updated>2007-03-26T02:58:45.536-07:00</updated><title type='text'>Yet another security alert</title><content type='html'>&lt;span style="font-family:courier new;"&gt;Days ago I found the following on the Web:&lt;br /&gt;&lt;a href="http://www.red-database-security.com/advisory/oracle_modify_data_via_views.html"&gt;http://www.red-database-security.com/advisory/oracle_modify_data_via_views.html&lt;/a&gt;&lt;br /&gt;where it says few words about serious security vulnerability which affects all versions of Oracle from 9.1.0.0 to 10.2.0.3. Briefly speaking, the main issue is that any user with SELECT privilege on another user’s table can insert/delete/update rows in that table via specially constructed view. They also mentioned Metalink note 363848.1 which is not accessible now for public user, probably due to security reasons.&lt;br /&gt;As an immediate workaround, it was recommended to sanitize the CONNECT role by removing the CREATE VIEW (and CREATE DATABASE LINK) privileges from that role as well as revoking unnecessary CREATE VIEW privilege from user accounts.&lt;br /&gt;&lt;br /&gt;So at first sight, it may seem that DBAs have an acceptable temporary solution to this problem. But recently I discovered that situation is &lt;span style="font-weight: bold;"&gt;much more disastrous&lt;/span&gt;. I was “lucky” to construct INSERT/UPDATE/DELETE statements which make it possible to update another user’s table without even creating any views. Thus, no special privileges are needed: &lt;span style="font-weight: bold;"&gt;a malicious user with a single CREATE SESSION privilege can modify tables in database while having only SELECT grants on those tables&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Unfortunately, it’s not a fake and the following test script proves that. Those DML statements were removed because I think this kind of knowledge should never be published for everyone’s sight.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;SQL*Plus: Release 9.2.0.6.0 - Production on Sun Apr 16 17:49:00 2006&lt;br /&gt;&lt;br /&gt;Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.&lt;br /&gt;&lt;br /&gt;SQL&gt; conn / as sysdba&lt;br /&gt;Connected.&lt;br /&gt;SQL&gt;&lt;br /&gt;SQL&gt; create user user1 identified by user1&lt;br /&gt;2 default tablespace users&lt;br /&gt;3 quota 10M on users;&lt;br /&gt;&lt;br /&gt;User created.&lt;br /&gt;&lt;br /&gt;SQL&gt; grant create session, create table to user1;&lt;br /&gt;&lt;br /&gt;Grant succeeded.&lt;br /&gt;&lt;br /&gt;SQL&gt; create user hacker identified by hacker;&lt;br /&gt;&lt;br /&gt;User created.&lt;br /&gt;&lt;br /&gt;SQL&gt; -- Only CREATE SESSION is granted to hacker&lt;br /&gt;SQL&gt;&lt;br /&gt;SQL&gt; grant create session to hacker;&lt;br /&gt;&lt;br /&gt;Grant succeeded.&lt;br /&gt;&lt;br /&gt;SQL&gt; conn user1/user1&lt;br /&gt;Connected.&lt;br /&gt;SQL&gt;&lt;br /&gt;SQL&gt; -- Create table in USER1 schema&lt;br /&gt;SQL&gt;&lt;br /&gt;SQL&gt; create table test (x int primary key, y varchar2(10));&lt;br /&gt;&lt;br /&gt;Table created.&lt;br /&gt;&lt;br /&gt;SQL&gt; insert into test&lt;br /&gt;2 select 1, 'One'&lt;br /&gt;3 from dual&lt;br /&gt;4 union all&lt;br /&gt;5 select 2, 'Two'&lt;br /&gt;6 from dual;&lt;br /&gt;&lt;br /&gt;2 rows created.&lt;br /&gt;&lt;br /&gt;SQL&gt; -- Grant SELECT on table to "hacker"&lt;br /&gt;SQL&gt;&lt;br /&gt;SQL&gt; grant select on test to hacker;&lt;br /&gt;&lt;br /&gt;Grant succeeded.&lt;br /&gt;&lt;br /&gt;SQL&gt; conn hacker/hacker&lt;br /&gt;Connected.&lt;br /&gt;SQL&gt;&lt;br /&gt;SQL&gt; select * from user1.test;&lt;br /&gt;&lt;br /&gt;X Y&lt;br /&gt;---------- ----------&lt;br /&gt;1 One&lt;br /&gt;2 Two&lt;br /&gt;&lt;br /&gt;SQL&gt; -- This will fail, as expected&lt;br /&gt;SQL&gt;&lt;br /&gt;SQL&gt; update user1.test&lt;br /&gt;2 set y = 'I AM HERE!'&lt;br /&gt;3 where x = 1;&lt;br /&gt;update user1.test&lt;br /&gt;*&lt;br /&gt;ERROR at line 1:&lt;br /&gt;ORA-01031: insufficient privileges&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;SQL&gt; -- Ouch...&lt;br /&gt;SQL&gt;&lt;br /&gt;SQL&gt; update&lt;br /&gt;2 &lt;... censored ...&gt;&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;1 row updated.&lt;br /&gt;&lt;br /&gt;SQL&gt; select * from user1.test;&lt;br /&gt;&lt;br /&gt;X Y&lt;br /&gt;---------- ----------&lt;br /&gt;1 I AM HERE!&lt;br /&gt;2 Two&lt;br /&gt;&lt;br /&gt;SQL&gt; rollback;&lt;br /&gt;&lt;br /&gt;Rollback complete.&lt;br /&gt;&lt;br /&gt;SQL&gt; select * from user1.test;&lt;br /&gt;&lt;br /&gt;X Y&lt;br /&gt;---------- ----------&lt;br /&gt;1 One&lt;br /&gt;2 Two&lt;br /&gt;&lt;br /&gt;SQL&gt; -- This will fail, too&lt;br /&gt;SQL&gt;&lt;br /&gt;SQL&gt; delete from user1.test&lt;br /&gt;2 where x = 1;&lt;br /&gt;delete from user1.test&lt;br /&gt;*&lt;br /&gt;ERROR at line 1:&lt;br /&gt;ORA-01031: insufficient privileges&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;SQL&gt; -- Ouch-ouch...&lt;br /&gt;SQL&gt;&lt;br /&gt;SQL&gt; delete from&lt;br /&gt;2 &lt;... censored ...&gt;&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;1 row deleted.&lt;br /&gt;&lt;br /&gt;SQL&gt; select * from user1.test;&lt;br /&gt;&lt;br /&gt;X Y&lt;br /&gt;---------- ----------&lt;br /&gt;2 Two&lt;br /&gt;&lt;br /&gt;SQL&gt; rollback;&lt;br /&gt;&lt;br /&gt;Rollback complete.&lt;br /&gt;&lt;br /&gt;SQL&gt; select * from user1.test;&lt;br /&gt;&lt;br /&gt;X Y&lt;br /&gt;---------- ----------&lt;br /&gt;1 One&lt;br /&gt;2 Two&lt;br /&gt;&lt;br /&gt;SQL&gt; -- This will fail, of course&lt;br /&gt;SQL&gt;&lt;br /&gt;SQL&gt; insert into user1.test&lt;br /&gt;2 values (3, 'I AM HERE!');&lt;br /&gt;insert into user1.test&lt;br /&gt;*&lt;br /&gt;ERROR at line 1:&lt;br /&gt;ORA-01031: insufficient privileges&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;SQL&gt; -- But...&lt;br /&gt;SQL&gt;&lt;br /&gt;SQL&gt; insert into&lt;br /&gt;2 &lt;... censored ...&gt;&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;1 row created.&lt;br /&gt;&lt;br /&gt;SQL&gt; select * from user1.test;&lt;br /&gt;&lt;br /&gt;X Y&lt;br /&gt;---------- ----------&lt;br /&gt;1 One&lt;br /&gt;2 Two&lt;br /&gt;3 I AM HERE!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Being sure that Oracle Corp. should fix this issue as soon as humanly possible, I’ve opened “severity 1” TAR on Metalink. Oracle Support personnel replied immediately that they are aware of that problem and it will surely be solved by April 2006 CPU planned for next week.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Note&lt;/span&gt;: I published this info here not to shed a light on Oracle Corp. and their products. It’s here just to warn DBAs and management staff that extremely high precautions should be taken until this issue is fixed.&lt;br /&gt;&lt;br /&gt;Andrew.&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18836672-114520527149964869?l=andrewmax.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andrewmax.blogspot.com/feeds/114520527149964869/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18836672&amp;postID=114520527149964869' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18836672/posts/default/114520527149964869'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18836672/posts/default/114520527149964869'/><link rel='alternate' type='text/html' href='http://andrewmax.blogspot.com/2006/04/yet-another-security-alert.html' title='Yet another security alert'/><author><name>Andrew Max</name><uri>http://www.blogger.com/profile/10398031744062944433</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18836672.post-113163650734289034</id><published>2005-11-10T07:26:00.000-08:00</published><updated>2007-01-25T19:39:53.610-08:00</updated><title type='text'>So I've decided to blog...</title><content type='html'>Hi everybody!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18836672-113163650734289034?l=andrewmax.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andrewmax.blogspot.com/feeds/113163650734289034/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18836672&amp;postID=113163650734289034' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18836672/posts/default/113163650734289034'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18836672/posts/default/113163650734289034'/><link rel='alternate' type='text/html' href='http://andrewmax.blogspot.com/2005/11/so-ive-decided-to-blog.html' title='So I&apos;ve decided to blog...'/><author><name>Andrew Max</name><uri>http://www.blogger.com/profile/10398031744062944433</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry></feed>
